2016-10-30 3 views
0

Java에서 동기화 된 블록의 개념에 대해 머리를 감싸는 데 어려움을 겪고 있습니다. 동기화 된 방법을 충분히 이해했다고 생각합니다. 그래서 저는 동기화 된 방법으로 동기화 된 블록을 이해할 수있는 비유를 생각했습니다. 제가 제안한 동등성이 올바른지 알려주십시오. 또한, 지금까지는 비 정적 동기화 된 블록에 대해서만 언급했습니다. 그러나 정적 동기 블록에 대한 포인트도 환영합니다.Java에서 동기화 된 블록의 단순화

public void method() 
{ 
    //code snipppet A 

synchronized(objRef) 
{ 
    //code snipppet B 
} 
    //code snipppet C 
} 

는 OBJREF의 클래스에서

public void method() { 
//code snippet A 
objRef.sync_method(); 
//code snippet C 
} 

하는 것과 같습니다

public synchronized void sync_method() { 
//code snippet B 
} 

이 비유는 블록이 동기화 방법은 마찬가지로 행동 동기화 로직을 기반으로합니다. 하나의 스레드가 모니터에서 잠금을 획득하면 다른 스레드가 해당 스레드의 실행을 방해하지 않는다는 것을 의미합니다. 스레드는 동기화 된 전체 메서드 실행을 마친 후에 만 ​​제어권을 보류합니다.

+0

생각 인쇄 할 수 있습니다. 명확하게하기 위해,'synchronized void method() {blabla(); }'는'void method() {synchronized (this) {blabla();에 대한 지름길이다. }}'. 둘 다 객체 'this'와 관련된 잠금을 얻은 다음 blabla()에서 코드를 실행 한 다음 잠금을 해제합니다. –

+1

명확히하기 위해 메서드가 아닌 개체 만 잠급니다. 동기화 된 메서드가있을 때는 메서드가 아니라 개체를 잠급니다. –

답변

2

two types of synchronized block in Java (개체 동기화 및 클래스 동기화)에 주목해야합니다. 두 가지 동기화 된 메서드 (정적 및 비 정적 메서드)와 해당 동등한 동기화 된 블록 (각각 클래스 및 개체 동기화 된 블록)이 있습니다. 은 우리가 가정

class MyClass{ 
public synchronized static void syncStaticMethod(){...} 
public synchronized void syncNonStaticMethod(){...} 
} 


MyClass objRef = new MyClass(); 

1. 개체 동기화 :

:

public void method() {synchronized(objRef) { ... }} 

public void method() {objRef.syncNonStaticMethod();} 

2. 클래스의 동기화에 해당

은 바로 모든 것을 얻기하지 않을 가능성이 있습니다

public void method() {MyClass.syncStaticMethod();} 
+0

마지막 스 니펫은 'MyClass.syncStaticMethod();'를 의미합니다. 그러나 구별하는 데는 별다른 요점이 없습니다. MyClass.class는 다른 객체와 마찬가지로 객체이며 필요한 경우 Class 객체의 인스턴스 메서드 본문을 완벽하게 동기화 할 수 있습니다. –

+0

두 방법의 명명법이 반대가되어서는 안됩니까? –

+0

@JBNizet : 감사합니다. 마지막 스 니펫을 수정합니다. – Atefeh

3

에 해당합니다. 예를 들어,

synchronized(objRef) { 
    objRef.nonsync_method(); 
    ... more code ... 
} 

때문에 잠금 코드의 더 큰 부분을 커버하는 전자의 경우

objRef.sync_method(); 

동등하지 않다. 스레드가 모니터에 대한 잠금을 획득하면, 그것은 다른 스레드의 실행

을 방해하는 것을 허용하지 않습니다
synchronized void sync_method() { 
    // stuff 
} 

하고 또한

void nonsync_method() { 
    synchronized (this) { 
     // stuff 
    } 
} 

,

사이에 동등성이 존재

우리가 해석하는 방식에 따라 위의 내용이 사실 일 수도 있고 아닐 수도 있습니다. 모호한 문구.잠금을 획득 한 스레드는 다른 스레드가 실행을 방해하도록 허용 할 수 있습니다. 동일한 잠금이 적용되지 않는 또 다른 코드가 있습니다. 예를 들어,

int i; 

synchronized void sync_method() { 
    i = 0; 
    System.out.println(i); 
} 

void nonsync_method() { 
    i = 42; 
} 

sync_method()에 대한 호출은 당신이 그것을 가지고 * 내가 * 모두 0, 42

+0

귀하의 첫 번째 요점에 관해서는, 그것이 바로 제 질문에서 의미했던 것입니다. 당신은 더 명확하고 구체적인 방법으로 그것을 작성했습니다. 나는 그것을 반영하기 위해 나의 질문을 편집 할 것이다. 귀하의 _second_ 포인트에 관해서는, 어떻게'sync_method()'호출이 0과 42 둘 다 인쇄 할 수 있는지 이해하지 못합니다. –

+0

1. syncMethod를 호출하십시오. 2.i = 0; 3. 다른 스레드가 nonsyncMethod를 호출합니다. 4. i = 42; 5. 인쇄하십시오. –

+0

좋아, 네가 지금 무슨 뜻인지 알 겠어. –

관련 문제