多线程如何获取monitor

网上说的: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()这里不再进行下去了?我就想知道为啥?是不是我的线程哪里理解任然有问题?急急急!

http://blog.csdn.net/hqq2023623/article/details/51000153

你obj_1 wait后释放了obj_1的锁,但是你obj_2.notify(); 这里只是通知,并不会释放锁obj_2。第二线程会死锁等待。而第一个线程也在等待