-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 내 영어 (
영어로하시기 바랍니다. – clover
https://ru.stackoverflow.com/ – luk2302
에 속하기 때문에이 질문을 주제와 다르게 끝내기로했습니다. – NikitaGordia