我在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();
}
}
答案 0 :(得分:2)
我认为他们写synchronized (__default)
代替synchronized (buffer)
的几率非常高。这是为了避免在调用__default
期间允许对append
进行任何更改(假设它们在其他位置同步,在进行更改时,或者其mutator函数执行时 - 您还没有提到{ {1}},并非如此重要)。在__default
上同步时,我完全看不出任何理由。
答案 1 :(得分:1)
这看起来完全没有意义 - buffer
实例就是在线程中构造的,因此没有其他线程可能有对它的引用。因此,synchronized
块将始终无争用,因此无法保护任何内容,并且以后没有其他线程会同步,因此没有内存一致性效果。
根据预期的语义,这可能是一个错误,或者它可能只是重构遗留下来的一个怪癖,不会造成任何问题。 (因为在正确性方面,它相当于根本不同步,而且在性能方面它只是稍微差一点。)
从好的方面来说,Java 6中的Hotspot将优化此块。 : - )