2012-04-16 5 views
3

.자바 syncrhonized 정적 메소드

그래서이에 syncrhonizing입니다 무엇 두 가지 질문

  1. 날 리드? 클래스, 또는 다른 뭔가?
  2. 클래스에서 동기화 할 수 있습니까? 해당 클래스의 모든 개체도 잠급니다.

는 예를 들어 당신은 MyClass

synchronized(Foo) // where Foo is a class 
{ 
} 
+0

예, 클래스 개체에 동기화 중입니다. 두 번째 질문을 올바르게 이해할 수 있는지 확실하지 않습니다. 다시 말씀해 주시겠습니까? – Jeffrey

+0

이제 내가 할께. – rubixibuc

+0

1) 'Class' 객체에서 동기화 중입니다. 2) 실제로는'synchronized (Foo.class) '이어야합니다. – fireshadow52

답변

3

동기화 정적 방법은 기본적으로 synchronized(MyClass.class) 블록과 동일 할 수있다. 두 번째 예제는

synchronized(Foo.class) { 
} 

으로 수정해야합니다.

클래스 동기화에 대해 방어하려는 경우 클래스 외부에 표시되지 않는 개인 정적 개체를 동기화해야합니다. 이렇게하면 악의적 인 코드가 클래스 객체에 synchronized을 실행하여 정적 메서드를 차단하지 못하게하여 합법적 인 메서드를 차단합니다.

한국인 간다 "모든 개체 잠금"와 같은 비 정적 메소드는 일반 synchronized 방법은 개체의 인스턴스 잠글 때문에 synchronized하지 그 클래스에 정적 synchronized 방법의 실행에 의해 고정되지 표시된 .

+0

그들은 문법적으로 같습니까? Foo.class를 사용하지 않으면 컴파일러 오류가 발생합니다. 컴파일러가 무슨 뜻인지 알고 있습니까? – rubixibuc

+0

@rubixibuc 컴파일러는'synchronized' 블록의 괄호 안에 제공 될 객체로 평가되는 표현식을 기대합니다. 'Foo'는 객체를 평가하는 표현식이 아니므로 컴파일 에러가 발생합니다. – dasblinkenlight

3

예, Class 개체에서 동기화 중입니다. Class 개체에서 동기화 할 수 있습니다. 리터럴 (Foo.class)을 사용하거나 Foo 인스턴스의 getClass() 메서드를 사용할 수 있습니다. 이를 아니오 http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+0

Doe Foo는 그 자체로 암시 적으로 항상 클래스 객체를 참조합니까? – rubixibuc

+0

@rubixibuc 아니요, 클래스가 아니라 * type *'Foo'를 말합니다. – Jeffrey

+0

syncrhonization 블록의 경우 참조가 사용됩니까? – rubixibuc

2
  1. 그것은 class 객체 동기화하는 예 MyClass.class
  2. : 동기화에 대한 자세한 내용

    (그 코스에서 두번째 페이지 잠금 동기화 방법이 사용되는 관한 정보를 포함) 클래스의 객체를 잠그지 않습니다.

0

정적 메서드는 클래스를 잠금 객체로 사용합니다.

Java 언어 사양의 관련 섹션 8.4.3.6, 'synchronized Methods'이다

동기화 된 방법은 실행 (§17.1) 전에 모니터를 획득한다. 클래스 (정적) 메소드의 경우, 메소드의 클래스에 대한 Class 객체와 연관된 모니터가 사용됩니다. 인스턴스 메소드의 경우, 이것과 연관된 모니터 (메소드가 호출 된 오브젝트)가 사용됩니다.