假如 A线程 调用了obj.wait() ,之后B线程 调用了obj.wait(),待B线程执行完synchronized(obj)代码块释放 obj锁。此时A线程拿到obj锁 继续运行线程 ,这之后A线程会一直拿着obj锁吗,还是被拿到锁 被唤醒后就 把锁释放了
怎么又是你,A在wait后如果不被notify是不能竞争锁的。锁的所有时间只在synchronized花括号内,花括号内肯定有锁,出去肯定没有,但是锁被释放后执行wait的线程无法获得锁,必须先被别的线程notify才能获取锁
写了一个小例子, 你自己反复运行几次, 试着按你自己的理解去改一改逻辑, 很快你就明白了
import static java.lang.Thread.sleep;
public class ABTest {
private static Object obj = new Object();
private static class ThreadA extends Thread{
public void run() {
System.out.println("a started");
synchronized (obj){
System.out.println("A do something and then wait");
obj.notify();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("a finished");
}
}
private static class ThreadB extends Thread{
public void run() {
System.out.println("b started");
synchronized (obj){
System.out.println("B do something and then wait");
try {
sleep(100);
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
obj.notify();
}
System.out.println("b finished");
}
}
public static void main(String [] args) throws InterruptedException {
Thread a = new ThreadA();
Thread b = new ThreadB();
a.start();
b.start();
synchronized (obj) {
sleep(1000);
System.out.println("main finished!");
obj.notify();
}
}
}