这里是四条线程,有两种写法,一种各两条.执行结果是:一旦A与B连着出现,CD就始终无法获取CPU执行权.不解为啥会出现这种问题.while在synchronized外面的线程为什么会获取不到执行权了(我自己琢磨出这个结果的),或者说是别的问题导致这种结果.
按道理,不是每次有线程synchronized代码块内执行了obj.wait(),其他线程都会去争夺CPU执行权,那CD线程也是可以抢到的,只是它每次唤醒拿到锁,拿到执行权的时候,在wait()处重新开始执行,下一步就是结束synchronized代码块,释放锁.重新开始while循环,需要重新获取锁才可以进入synchronized代码块.
为什么一旦AB线程相连出现,CD线程就不执行了呢??????
public class Demo {
public static Object obj = new Object();
public static void main(String[] args) {
new Thread(()-> {
while(true){
System.out.println("-----------------CC线程------------------");
synchronized (obj){
System.out.println("---------------------CCCCCCCC-----------");
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(()-> {
while(true){
System.out.println("-------------DD线程--------------------");
synchronized (obj){
System.out.println("-----------------DDDDDD-------------");
obj.notifyAll();
try {
obj.wait();//B抢到CPU 抢到锁 才此处唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(()-> {
synchronized (obj){
while(true){
System.out.println("-------------------AA线程---------------------");
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(()-> {
synchronized (obj){
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--------------BB线程-----------");
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}