漫路求索 2017-04-20 13:55 采纳率: 0%
浏览 1378

多线程如何获取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()这里不再进行下去了?我就想知道为啥?是不是我的线程哪里理解任然有问题?急急急!
  • 写回答

2条回答 默认 最新

  • threenewbee 2017-04-20 15:42
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 R语言 拟时序分析降维图如何减少分支
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统