-2

최근에 Bruce Eckel (Java로 생각하기)을 읽었으며 몇 가지 문제점을 발견했습니다. 블록 동기화 (Object) 잠금 클래스! 이 클래스의 객체가 아닙니다. 이 코드는 위에서 언급 한 것으로 증명됩니다.Object가 아닌 Java 동기화 잠금 클래스입니까?

public class Main { 

    public static void main(String[] args) { 
     Sync s = new Sync(); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       s.go(); 
      } 
     }, "First").start(); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       s.go(); 
      } 
     }, "Second").start(); 
    } 
} 

class Sync { 

    private Writer w1, w2; 

    public Sync() { 
     w1 = new Writer(); 
     w2 = new Writer(); 
    } 

    public void go() { 
     synchronized (w2) { 
      w1.log(Thread.currentThread().getName() + "...1"); 
      //!All threads must performance parallel, but they do it consistently. 
      w2.log(Thread.currentThread().getName() + "...2"); 
      //All threads must performance parallel, and they do it. 
     } 
    } 
} 

class Writer { 
    public void log(Object obj) { 
     for (int i = 0; i < 5; i++) { 
      lgn(obj); 
      try { 
       TimeUnit.MILLISECONDS.sleep(750); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

나는 w2를 잠 갔지만 w2는 잠겼습니다. !! w1. 왜? w1과 w2가 다른 개체입니다! 그들은 왜 함께 잠근거야?

그러나 모든 출처는 클래스가 아닌 동기화 된 OBJECT에서 잠금에 대해 이야기합니다. 착각 한 경우 어떻게 작동하는지 이해하도록 도와 줄 수 있습니까?

출력

First...1 
First...1 
First...1 
First...1 
First...1 
First...2 
First...2 
First...2 
First...2 
First...2 
Second...1 
Second...1 
Second...1 
Second...1 
Second...1 
Second...2 
Second...2 
Second...2 
Second...2 
Second...2 

예상 출력

First...1 
Second...1 
First...1 
Second...1 
First...1 
Second...1 
First...1 
Second...1 
First...1 
Second...1 
First...2 
First...2 
First...2 
First...2 
First...2 
Second...2 
Second...2 
Second...2 
Second...2 
Second...2 

PS 내 영어 (

+1

영어로하시기 바랍니다. – clover

+3

https://ru.stackoverflow.com/ – luk2302

+0

에 속하기 때문에이 질문을 주제와 다르게 끝내기로했습니다. – NikitaGordia

답변

0

synchronized (w2) 우리가 W2, 객체 W2 잠금하지와 잠금을 만드는 것을 의미합니다. 당신은 잠금을 만들 수 있습니다 죄송합니다 동기화 된 블록의 코드는 여전히 잠겨 있습니다.

class Sync { 

    private Writer w1, w2; 
    private Object whatEver; 

    public Sync() { 
     w1 = new Writer(); 
     w2 = new Writer(); 
     whatEver = new Object(); 
    } 

    public void go() { 
     synchronized (whatEver) { 
      w1.log(Thread.currentThread().getName() + "...1"); 
      //!All threads must performance parallel, but they do it consistently. 
      w2.log(Thread.currentThread().getName() + "...2"); 
      //All threads must performance parallel, and they do it. 
     } 
    } 
}