2013-08-17 2 views
0

에 잠금 자바 클래스에서 내 지식으로 당자바 스레드 정적 메서드

  1. 비 정적 동기화 방법 : 특정 객체에
  2. 정적 동기화 방법을 습득 잠금 : 클래스를 취득 잠금

정적 메서드를 클래스 이름 또는 개체 이름으로 호출 할 수 있으므로 약간 혼란 스럽습니다.

4 가지 방법이 모두 내 클래스를 동기화한다고 가정하십시오. 2 가지 방법은 정적이고 2 가지 방법은 정적이 아닙니다. 나는 내 수업 "으로 obj1"1 개 객체를 생성하고이 스레드 Thread1하고 Thread2뿐만 아니라이있는 경우

질문 1 : 내가 OBJ1를 사용하여 정적 동기화 방법에 액세스하려고 할 경우 (또는 클래스 이름). "obj1"에 대한 잠금이 없다는 것을 의미합니까? 단지 2 개의 정적 메서드가 잠길 것입니다 (클래스 수준 잠금)? 다른 스레드가 비 정적 메서드에 액세스 할 수 있지만 "obj1"을 동시에 사용하는 정적 메서드는 아닌 것을 의미합니까?

질문 2 : 내가 Thread1에서 OBJ1를 사용하여 비 정적 동기화 방법에 액세스하려고합니다합니다. Thread2에 2 개의 메소드 만 잠긴 것을 의미합니까? 내 클래스의 모든 메소드는 정적이며 동기화하는 경우 :뿐만 아니라 동시에

질문 3 Thread2 2 정적 메서드에 액세스 할 수 있습니다, 또는 우리는 클래스 명 (MyClass에)를 사용하여 정적 메서드를 액세스 할 수 있습니다. 이것은 객체 레벨 잠금이없고 모든 스레드에 대해 단 하나의 클래스 레벨 잠금 만 있다는 것을 의미합니다. ?

사전에 클래스 레벨 잠금에 대해

감사를 조금 설명해주십시오. 당신은 그것은 잠금이 Class 객체에 있다는 사실을 변경하지 않습니다

someObject.staticMethod() 

와 정적 메소드를 호출해도

+2

특정 [잠금 개체] (http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html)를 사용하면 클래스 또는 인스턴스를 사용하여 잠금 기능을 사용하는 것이 좋습니다. –

+1

@HovercraftFullOfEels 우수한 사용자 이름! :-) –

답변

11

. 혼란스럽지 않게 정적 메서드를 호출하고 올바르게 호출해야 함을 의미합니다. 그냥 완벽하게 잘 작동하기 때문에, 코드를 덜 읽을 수 있도록 만들지 않는 한이 코드를 사용해야합니다.

클래스 수준 잠금에는 특별한 것이 없습니다. 인스턴스 대신 Class 객체 만 사용하고 모든 정적 동기화는 동일한 Class 객체를 사용하기 때문에 작동합니다.

지난 질문에 대해서는 그렇습니다. 정적 동기화 된 메서드 만있는 경우 생성 한 클래스의 인스턴스 수에 관계없이 클래스 개체를 모두 잠금으로 공유합니다.

+0

설명해 주셔서 감사합니다 .... 투표하십시오. –

관련 문제