网上说的:Java中每个对象都有唯一的一个monitor,想拥有一个对象的monitor的话有三种方(其中有一个 执行该对象的同步块 )
public class ThreadCs {
private static int flag=1 ;
private static Object obj_1 = new Object();
private static Object obj_2 = new Object();
private static Object obj_3 = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
for(int i=0;i<10;i++){
while(flag==1){
synchronized (obj_1) {
System.out.println("AAAobj_1");
synchronized (obj_2) {
System.out.println("AAAobj_2");
System.out.println(Thread.currentThread().getName());
flag=2;
obj_2.notify();
try {
obj_1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
},"A").start();
new Thread(new Runnable() {
public void run() {
for(int i=0;i<10;i++){
while(flag==2){
synchronized (obj_2) {
System.out.println("BBBobj_2");
synchronized (obj_3) {
System.out.println("BBBobj_3");
System.out.println(Thread.currentThread().getName());
flag=3;
obj_3.notify();
try {
obj_2.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
},"B").start();
new Thread(new Runnable() {
public void run() {
for(int i=0;i<10;i++){
while(flag==3){
synchronized (obj_3) {
System.out.println("CCCobj_2");
synchronized (obj_1) {
System.out.println("CCCobj_3");
System.out.println(Thread.currentThread().getName());
flag=1;
obj_1.notify();
try {
obj_3.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
},"C").start();
}
那么我就想问一下,我这段代码,线程A执行了wait方法后,会失去obj_1的锁,并且线程阻塞。可是我的线程C会去把第一个线程A唤醒,那么好,当第一个线程唤醒后,会执行synchronized (obj_1) {}的,这样不是会让第一个线程再次获得obj_1的执行权吗?但是现在却阻塞在obj_1.wait()这里不再进行下去了?我就想知道为啥?是不是我的线程哪里理解任然有问题?急急急!