-2

最近私はBruce Eckel(Thinking in Java)を読んでいて、いくつかの問題を発見しました。このクラスのオブジェクトではありません。このコードは上記のとおりです:オブジェクトではなく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は異なるオブジェクトです!なぜ彼らは一緒にロックされていますか?

しかし、すべての情報源は、同期オブジェクトではなく、クラスでロックすることを話しています。私が間違ってしまった場合、それがどのように機能するのか理解できますか?

出力

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. 
     } 
    } 
} 
関連する問題