虚假唤醒 if
package pc;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class D1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("马云");
list.add("马化腾");
list.add("云游令");
list.add("黑麒麟");
D1 d1 = new D1();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
Random random = new Random();
int i1 = random.nextInt(3);
d1.jia(list.get(i1));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
Random random = new Random();
int i1 = random.nextInt(3);
d1.jian(list.get(i1));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"B").start();
}
private int number = 0;
//+1
public synchronized void jia(String name) throws InterruptedException {
if(number!=0){
//等待
this.wait();
}
number++;
System.out.println(Thread.currentThread().getName()+">"+name+">"+number);
// 通知其他线程,我+1完毕了
this.notifyAll();
}
//-1
public synchronized void jian(String name) throws InterruptedException {
if(number==0){
//等待
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName()+">"+name+">"+number);
// 通知其他线程,我-1完毕了
this.notifyAll();
}
}
A>马云>1
B>马云>0
A>马化腾>1
B>云游令>0
A>马云>1
B>马化腾>0
A>马云>1
B>马化腾>0
A>云游令>1
B>云游令>0
A>马化腾>1
B>马化腾>0
A>马云>1
B>马化腾>0
A>马化腾>1
B>马化腾>0
A>马云>1
B>马化腾>0
A>云游令>1
B>马云>0
Process finished with exit code 0
保证唤醒 while
package pc;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class D1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("马云");
list.add("马化腾");
list.add("云游令");
list.add("黑麒麟");
D1 d1 = new D1();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
Random random = new Random();
int i1 = random.nextInt(3);
d1.jia(list.get(i1));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
Random random = new Random();
int i1 = random.nextInt(3);
d1.jian(list.get(i1));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"B").start();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
Random random = new Random();
int i1 = random.nextInt(3);
d1.jia(list.get(i1));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"C").start();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
Random random = new Random();
int i1 = random.nextInt(3);
d1.jian(list.get(i1));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"D").start();
}
private int number = 0;
//+1
public synchronized void jia(String name) throws InterruptedException {
while(number!=0){
//等待
this.wait();
}
number++;
System.out.println(Thread.currentThread().getName()+">"+name+">"+number);
// 通知其他线程,我+1完毕了
this.notifyAll();
}
//-1
public synchronized void jian(String name) throws InterruptedException {
while(number==0){
//等待
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName()+">"+name+">"+number);
// 通知其他线程,我-1完毕了
this.notifyAll();
}
}
A>马化腾>1
B>云游令>0
C>马化腾>1
D>云游令>0
A>马化腾>1
D>云游令>0
C>云游令>1
B>马云>0
C>马化腾>1
D>马化腾>0
A>马化腾>1
D>马云>0
C>云游令>1
B>云游令>0
C>马化腾>1
D>马云>0
A>马云>1
D>马化腾>0
C>云游令>1
B>马化腾>0
C>云游令>1
D>马云>0
A>云游令>1
D>马化腾>0
C>马化腾>1
B>马化腾>0
C>云游令>1
D>马云>0
A>云游令>1
D>马云>0
C>云游令>1
B>马化腾>0
A>云游令>1
B>马化腾>0
A>云游令>1
B>云游令>0
A>马化腾>1
B>马化腾>0
A>马化腾>1
B>马云>0