防止if虚假唤醒
public class TestDemo11 {
public static void main(String[] args) {
F f = new F();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
f.add();
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
f.sub();
}
}, "B").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
f.add();
}
}, "C").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
f.sub();
}
}, "D").start();
}
}
class F {
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void add() {
lock.lock();
try {
while (number != 0) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number++;
System.out.println(Thread.currentThread().getName() + ":\t" + number);
condition.signalAll();
} finally {
lock.unlock();
}
}
public void sub() {
lock.lock();
try {
while (number == 0) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number--;
System.out.println(Thread.currentThread().getName() + ":\t" + number);
condition.signalAll();
} finally {
lock.unlock();
}
}
}
class AA {
private int t = 0;
public synchronized void add() {
while (t != 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
t++;
System.out.println(Thread.currentThread().getName() + " " + t);
this.notifyAll();
}
public synchronized void sub() {
while (t == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
t--;
System.out.println(Thread.currentThread().getName() + " " + t);
this.notifyAll();
}
}
public class Demo1 {
public static void main(String[] args) {
AA aa = new AA();
new Thread(() -> {
for (int i = 0;i<10;i++){
aa.add();
}
},"a").start();
new Thread(() -> {
for (int i = 0;i<10;i++){
aa.sub();
}
},"b").start();
}
}