2010-11-18 2 views
0

org.mortbay.util.ajax 패키지의 jetty-util JSON 클래스에 이상한 코드가 있으며 오류인지 아닌지 궁금합니다. 나의 추측은 메모리에서 변수 _deafult을 읽는 것입니다, 여러분의 생각을 공유하십시오! 완전히 무의미 보는가JSON strange 소스 코드에서 동기화 됨

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

답변

1

은 - buffer 인스턴스는 스레드 내에서 바로 구성되어, 그래서 다른 스레드 가능성에 대한 참조를 가질 수 없었다. 따라서 synchronized 블록은 이 항상이되며, 따라서 아무 것도 지키지 않으며 나중에 다른 스레드가 동기화하지 않으므로 메모리 일관성 효과가 없습니다.

의도 된 의미에 따라 이것은 오류 일 수도 있고 문제를 일으키지 않는 리팩토링에서 남겨진 특이 사항 일 수도 있습니다. (정확성 측면에서는 동기화가 전혀 이루어지지 않는 것과 같기 때문에 성능 측면에서는 약간만 악화됩니다.)

Java 6의 핫스팟은이 블록을 최적화합니다. :-)

+0

이 코드 조각은 현재 스레드 _default 변수로 캐싱을 다시 읽는 데 필요하다고 생각했습니다. 어떻게 생각해? – pls

+0

@pls - 음, 다른 스레드가 동일한 모니터에서 동기화 할 수 없기 때문에 뮤텍스 효과가 없으며 다른 스레드가 동일한 모니터에서 다시 동기화 할 수 없으므로 메모리 일관성 효과가 없습니다. 따라서'_default' 변수로 할 일은 아무것도하지 않을 것입니다. –

2

나는 확률이 대신에 synchronized (buffer)이라고 쓰고 싶다고 말하고 싶습니다. 이것은 append으로 전화하는 동안 __default에 대한 변경을 허용하지 않을 것입니다 (다른 곳에서도 동기화 할 때, 변경시 또는 변경자 기능이   — 일 때 __default이 무엇인지는 언급하지 않았 음)). buffer에서 동기화 할 이유가 전혀 없습니다.