1.synchronized+wait+notify
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestLock{
public static void main(String[] args) {
Data data = new Data();
new Thread(() -> {
for(int i = 0; i < 50; i++){
try {
data.even();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "a").start();
new Thread(() -> {
for(int i = 0; i < 50; i++){
try {
data.odd();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "b").start();
}
}
//判断等待、业务、通知
class Data{//资源类
private int num = 0;
public synchronized void odd() throws InterruptedException{
while(num != 0){
wait();
}
num++;
System.out.println(Thread.currentThread().getName() + "==>" + num);
//通知另一个线程我完事了
notify();
}
public synchronized void even() throws InterruptedException{
while(num == 0){//偶数此路不通
wait();
}
num--;
System.out.println(Thread.currentThread().getName() + "==>" + num);
//通知另一个线程我完事了
notify();
}
}
注意:不能用if来判断等待,否则当开启四个线程时会有问题(即虚假唤醒问题)
2.lock