java中使用waitnotify
现在锁用ReadWriteLock、Condition这类封装好的比较多了,但是还是有很多代码是用wait、notify实现的.
我们还是要明白基本的使用,wait-让出监控器监视器进入等待队列;
notify-只是唤醒(不进行判断)等待监控器的线程,所以一般判断进入等待的代码应该是一个while循环,否则可能没有起到判断的作用.
示例代码
private static int condition =1;
public static void main(String[] args) throws Exception {
Object lockObj = new Object();
new Thread(()->{
synchronized(lockObj) {
if(condition<=1) {
try {
lockObj.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("condition>1 condition:"+condition);
}
}).start();
Thread.sleep(3000L);
synchronized(lockObj) {
condition = 0;
lockObj.notify();
}
Thread.sleep(3000L);
new Thread(()->{
synchronized(lockObj) {
while(condition<=9) {
try {
lockObj.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("condition>9 condition:"+condition);
}
}).start();
synchronized(lockObj) {
condition = 8;
lockObj.notifyAll();
}
System.out.println("condition=8 notify");
Thread.sleep(3000L);
synchronized(lockObj) {
condition = 10;
System.out.println("condition=10 notify");
lockObj.notifyAll();
}
}
输出
condition>1 condition:0
condition=8 notify
condition=10 notify
condition>9 condition:10