-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(
英語でお願いします。 – clover
https://ru.stackoverflow.com/ – luk2302
に翻訳されているため、この質問をオフトピックとして閉じるように投票しています – NikitaGordia