JSON奇怪的源代码同步

时间:2010-11-18 12:51:29

标签: java json synchronization jetty

我在org.mortbay.util.ajax包中的jetty-util的JSON类中发现了这样一个奇怪的代码,并想知道它是否是一个错误。 我唯一的猜测是从内存中读取_deafult变量,分享你的想法!

public static String toString(Object object)
    {
        StringBuffer buffer=new StringBuffer(__default.getStringBufferSize());
        synchronized (buffer)
        {
            __default.append(buffer,object);
            return buffer.toString();
        }
    }

2 个答案:

答案 0 :(得分:2)

我认为他们写synchronized (__default)代替synchronized (buffer)的几率非常高。这是为了避免在调用__default期间允许对append进行任何更改(假设它们在其他位置同步,在进行更改时,或者其mutator函数执行时 - 您还没有提到{ {1}},并非如此重要)。在__default上同步时,我完全看不出任何理由。

答案 1 :(得分:1)

这看起来完全没有意义 - buffer实例就是在线程中构造的,因此没有其他线程可能有对它的引用。因此,synchronized块将始终无争用,因此无法保护任何内容,并且以后没有其他线程会同步,因此没有内存一致性效果。

根据预期的语义,这可能是一个错误,或者它可能只是重构遗留下来的一个怪癖,不会造成任何问题。 (因为在正确性方面,它相当于根本不同步,而且在性能方面它只是稍微差一点。)

从好的方面来说,Java 6中的Hotspot将优化此块。 : - )