그래서이에 syncrhonizing입니다 무엇 두 가지 질문
- 날 리드? 클래스, 또는 다른 뭔가?
- 클래스에서 동기화 할 수 있습니까? 해당 클래스의 모든 개체도 잠급니다.
는 예를 들어 당신은 MyClass
이
synchronized(Foo) // where Foo is a class
{
}
그래서이에 syncrhonizing입니다 무엇 두 가지 질문
는 예를 들어 당신은 MyClass
이
synchronized(Foo) // where Foo is a class
{
}
동기화 정적 방법은 기본적으로 synchronized(MyClass.class)
블록과 동일 할 수있다. 두 번째 예제는
synchronized(Foo.class) {
}
으로 수정해야합니다.
클래스 동기화에 대해 방어하려는 경우 클래스 외부에 표시되지 않는 개인 정적 개체를 동기화해야합니다. 이렇게하면 악의적 인 코드가 클래스 객체에 synchronized
을 실행하여 정적 메서드를 차단하지 못하게하여 합법적 인 메서드를 차단합니다.
한국인 간다 "모든 개체 잠금"와 같은 비 정적 메소드는 일반 synchronized
방법은 개체의 인스턴스 잠글 때문에 synchronized
하지 그 클래스에 정적 synchronized
방법의 실행에 의해 고정되지 표시된 .
그들은 문법적으로 같습니까? Foo.class를 사용하지 않으면 컴파일러 오류가 발생합니다. 컴파일러가 무슨 뜻인지 알고 있습니까? – rubixibuc
@rubixibuc 컴파일러는'synchronized' 블록의 괄호 안에 제공 될 객체로 평가되는 표현식을 기대합니다. 'Foo'는 객체를 평가하는 표현식이 아니므로 컴파일 에러가 발생합니다. – dasblinkenlight
예, Class
개체에서 동기화 중입니다. Class
개체에서 동기화 할 수 있습니다. 리터럴 (Foo.class
)을 사용하거나 Foo
인스턴스의 getClass()
메서드를 사용할 수 있습니다. 이를 아니오 http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
class
객체 동기화하는 예 MyClass.class
(그 코스에서 두번째 페이지 잠금 동기화 방법이 사용되는 관한 정보를 포함) 클래스의 객체를 잠그지 않습니다.
정적 메서드는 클래스를 잠금 객체로 사용합니다.
Java 언어 사양의 관련 섹션 8.4.3.6, 'synchronized Methods'이다
동기화 된 방법은 실행 (§17.1) 전에 모니터를 획득한다. 클래스 (정적) 메소드의 경우, 메소드의 클래스에 대한 Class 객체와 연관된 모니터가 사용됩니다. 인스턴스 메소드의 경우, 이것과 연관된 모니터 (메소드가 호출 된 오브젝트)가 사용됩니다.
예, 클래스 개체에 동기화 중입니다. 두 번째 질문을 올바르게 이해할 수 있는지 확실하지 않습니다. 다시 말씀해 주시겠습니까? – Jeffrey
이제 내가 할께. – rubixibuc
1) 'Class' 객체에서 동기화 중입니다. 2) 실제로는'synchronized (Foo.class) '이어야합니다. – fireshadow52