2017-10-14 7 views
0

Java에서 synchronized() {}을 (를) 이해하는 데 문제가 있습니다. 어떻게 든 나는이 클래스의 인스턴스를 잠그고 다른 스레드로부터이 특정 인스턴스의 함수를 호출하거나 속성에 액세스하려는 경우 synchronized (over)가 동기화 될 때까지 기다려야한다고 생각했습니다. 어쨌든이 샘플 코드에서는 DOESNT가 작동합니다. 스레드 A가 스레드 B가 뭔가를 수행하고 나중에 수행 할 때까지 기다려야합니다.변수를 동기화/잠금하는 방법은 무엇입니까?

public class A implements Runnable{ 
public void start(){ 
    Thread t = new Thread(this); 
    t.start(); 
} 
public void run(){ 
    B b = new B(); 
    b.start(); 

    //DO STUFF 
    while(b.loaded){ 
     //WAIT FOR B DOING STUFF 
    } 

    //GO ON DOING STUFF 
} 
} 

public class B implements Runnable { 
public boolean loaded; 
public B(){ 
    loaded = false; 
} 
public void start(){ 
    Thread thread = new Thread(this); 
    thread.start(); 
} 

public void run(){ 
    //DOING STUFF 
    synchronized (this){ 
     loaded = true; 
    } 
    //DO OTHER STUFF 
} 

} 

I라는 방법을 할 경우 작동 ,

public synchronized boolean getLoaded(){return loaded;} 

왜 쓰기 및 읽기 프로세스를 동기화해야합니까? 쓰는 동안 객체가 잠긴 경우라면 충분하지 않아야합니다. 그러면 읽기가 어쨌든 기다려야합니까? 첫 번째 예제에서 나는 다음과 같은 일을하는 프로그래밍을 기대합니다 :

스레드 A는로드 된 변수를 읽습니다.

스레드 B는로드 된 변수를 쓰기를 원하지만 객체를 잠급니다.

스레드 A는로드 된 변수를 읽으려고 시도하지만 객체가 잠겨 기다립니다.

스레드 B가 변수를 씁니다.

스레드 B가 잠금 해제됩니다.

스레드 A는 계속 읽습니다.

이 주제에 대해 많이 읽었지만 100 %처럼 이해할 수는 없습니다. 누군가가 그 간단한 프로젝트를 설명해 주길 바래.

답변

1

동기화 작업에 대한 이해가 잘못되었습니다. 사용하는 개체를 잠그지 않지만 해당 개체를 세마포어로 사용하여 코드를 잠급니다. 귀하의 예 :

synchronized (this){ 
    loaded = true; 
} 

은 단 한 줄의 "loaded = true"를 잠급니다. 다른 스레드가 동일한 코드 행을 입력 할 수 없게합니다. 세마포어를 해제하여 첫 번째 스레드 (세마포어 소유)가 블록을 떠날 때까지 "동기화 된 (this)"문에서 대기합니다.

문제는 하나의 스레드가 다른 스레드의 이벤트를 기다리고 알림을받을 수있는 방법입니다. 그런 일을하는 꽤 다른 기술들이 있습니다. 현대의 것 (java8)은 CompletableFuture를 사용하는 것입니다. 자바의 뿌리에서 더 많이 또 다른 하나는 wait()와 notify()입니다. 두 가지는 각각의 Object (그리고 그것의 derivetions)가 알고있는 메소드입니다. 후자의 간단한 예제 this SO answer

+0

나는 동기화에 관한 3 개의 기사를 읽었지만 아무도 같은 대상에 대해서만 언급했다. 쉬운 설명이지만 마침내 나는 동기화가 무엇인지 이해했다! 대단히 감사합니다 :)) 아프고 기다려보고 지금 알려주십시오. 아마 이것은 내 문제를 해결할 것입니다 :) – ScriptWorld