A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 从前有个人 中级黑马   /  2013-11-8 15:58  /  1070 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package multithread;

class Ticket {

        public static void main(String[] args) {
                // TODO 自动生成的方法存根
                SaleTicket seller = new SaleTicket();

                Thread thread1 = new Thread(seller);
                Thread thread2 = new Thread(seller);
                Thread thread3 = new Thread(seller);

                thread1.start();
                thread2.start();
                thread3.start();
        }
}

class SaleTicket implements Runnable{
        private int x = 10;
        Object obj = new Object();
        public void run(){
                while(true)
                        synchronized(new Object()){  //  传入obj对象,程序执行正常。传入new Object(),synchronized块就会失效 WHY?
                                if(x>0){
                                        try{Thread.sleep(10);} catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+" sell ticket"+x--);
                                }
                        }
        }
}

问题如注释所述,为何传入 obj 和 传 new Object()会不同结果。
以下是传入 new Object()的执行结果


Thread-0 sell ticket10
Thread-1 sell ticket9
Thread-2 sell ticket8
Thread-0 sell ticket7
Thread-1 sell ticket6
Thread-2 sell ticket5
Thread-0 sell ticket4
Thread-1 sell ticket3
Thread-2 sell ticket2
Thread-0 sell ticket1
Thread-2 sell ticket0
Thread-1 sell ticket-1

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

2 个回复

倒序浏览
while(true){
        synchronized(new Object()){  //  传入obj对象,程序执行正常。传入new Object(),synchronized块就会失效WHY?
                if(x>0){
                        try{Thread.sleep(10);} catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+" sell ticket"+x--);
                }
        }
}
你每次进入循环相当于把前一个锁砸坏了扔了,用一把新锁锁住,然后强行进入房间。别人来了照样不会看你这把锁有没有用,而是直接砸坏扔了,这样你的锁的作用就完全失去了。
回复 使用道具 举报
是这样的
继承了runnable接口以后,在各自的线程中都有一个run()方法,而run()方法以外的成员变量都是共享数据。
明白了这个以后,就是理解锁的概念了。
你应该知道,要想对一个代码块进行同步,需要用同一个锁吧?像你这样如果在run()里面直接new Object()
,那么这个锁就是一个线程所拥有,跟其他的线程没关系,当然就起不到同步的作用啦。而调用run()方法以外的obj就不同啦,因为这个锁是所有线程共有的,当然了起到同步的作用啦~~~

so easy,来了黑马论坛以后,妈妈再也不用担心我的学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马