db-*_*ser 3 java concurrency multithreading
我是Java并发新手.我有一个简单的对象,有3个方法,每个方法对应3个不同线程运行的代码.为什么在这种情况下notifyAll()语句不释放其他两个线程中的wait?
public class Main {
static class Obj {
synchronized void t1 () {
System.out.println("T1 ran");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
notifyAll();
}
synchronized void t2 () {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T2 ran");
}
synchronized void t3() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T3 ran");
}
}
public static void main(String[] args) {
final Obj o = new Obj();
new Thread(new Runnable() {
@Override
public void run() {
o.t1();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
o.t2();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
o.t3();
}
}).start();
}}
Run Code Online (Sandbox Code Playgroud)
我预料到:T1跑了~~暂停1秒~~ T2跑了T3跑了
我得到了:T1跑了
Thread.sleep不会以这种方式释放或放松任何锁定wait,因此同步仍然完全有效,并且在睡眠期间不允许其他线程进入其方法.
如果你更换了
Thread.sleep(1000);
Run Code Online (Sandbox Code Playgroud)
同
wait(1000);
Run Code Online (Sandbox Code Playgroud)
其他线程将被允许捕获相同的锁,输入方法,开始等待,样本将按预期工作.