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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
  1. class Ticket implements Runnable
  2. {         //private static int tick = 100
  3. <font color="#ff0000">        Object obj = new Object();//正常代码位置,起到线程锁的作用。</font>
  4.         private  int tick = 100;
  5.         public void run()
  6.         {
  7.                 <span style="line-height: 30.8px;"><font color="#ff00ff">Object obj = new Object();//问题代码位置,起不到线程锁的作用</font></span>
  8.                 while(true)
  9.                 {
  10.                         synchronized(obj)
  11.                         {
  12.                       if (tick>0)
  13.                        {

  14.                              try{Thread.sleep(100);}catch(Exception e){}
  15.                               System.out.println(Thread.currentThread().getName()+"x = "+tick--);
  16.                        }
  17.                         }
  18.                
  19.                 }
  20.        
  21.         }
  22. }
  23. class TicketDemo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.               Ticket t = new Ticket();
  28.                   Thread t1= new Thread(t)
  29.                   Thread t2 = new Thread(t);
  30.                   Thread t3 = new Thread(t);
复制代码

最佳答案

查看完整内容

很明显,放到里面是不管用的。还记得毕老师举的火车上的卫生间的例子吗?这放到里边就等于每个人都是已经开始拉屎了才上的锁。。。= =已经晚了。。 你在run方法里new锁对象不是等于每个线程都new了一个对象锁吗?这不符合毕老师讲的同一个同步代码块用同一个对象锁呀,所以肯定不会同步了呀。 所以你要在外边把锁确定好了,而不是每个run里面的时候再new一个。否则会等于每一个线程都有自己的一个对象锁,而不是所有的线程共用一个 ...

11 个回复

倒序浏览
很明显,放到里面是不管用的。还记得毕老师举的火车上的卫生间的例子吗?这放到里边就等于每个人都是已经开始拉屎了才上的锁。。。= =已经晚了。。
你在run方法里new锁对象不是等于每个线程都new了一个对象锁吗?这不符合毕老师讲的同一个同步代码块用同一个对象锁呀,所以肯定不会同步了呀。
所以你要在外边把锁确定好了,而不是每个run里面的时候再new一个。否则会等于每一个线程都有自己的一个对象锁,而不是所有的线程共用一个对象锁,那还有什么意义呢?
讲的已经很明白了。。。。。如果还不明白可以反问我~~
好好看毕老师的录像哦~要看透
回复 使用道具 举报
讲的真好啊,感觉很牛逼啊.
回复 使用道具 举报
Mykey 发表于 2015-12-14 22:21
讲的真好啊,感觉很牛逼啊.

- -你确定你看过这个问题,
回复 使用道具 举报
shaoshuai199334 发表于 2015-12-14 22:57
- -你确定你看过这个问题,

没有,但是感觉牛逼.
回复 使用道具 举报
锁放的位置不同起到的作用是不同的,锁的应用有很多的途径,但是使用的时候要注意,是不是真的需要,有些API是实现了锁的
回复 使用道具 举报
lixy 中级黑马 2015-12-16 20:56:44
7#
做的和题目“构建线程锁对象构建对象位置不同的影响”有关吗,怪我学的不精,没看出来
回复 使用道具 举报
青菜市场 来自手机 中级黑马 2015-12-17 14:59:45
8#
我是这么理解的,把锁定以在run方法外,当ticket对象一建立锁就建立了,可以作用用于run方法。而把锁定义在run方法内,也就是只有调用了run方法锁才建立,也就是线程启动run方法之前必须有锁。出问题原因好比说我进了门了然后再去建锁,这样的锁没有意义。
谢谢,手机码字辛苦啊
回复 使用道具 举报
青菜市场 发表于 2015-12-17 14:59
我是这么理解的,把锁定以在run方法外,当ticket对象一建立锁就建立了,可以作用用于run方法。而把锁定义在 ...

....明白了谢谢谢谢!!!!!
回复 使用道具 举报
zcbcba123 发表于 2015-12-14 21:31
很明显,放到里面是不管用的。还记得毕老师举的火车上的卫生间的例子吗?这放到里边就等于每个人都是已经开 ...

讲的很好谢谢谢谢!!!!
回复 使用道具 举报
lixy 发表于 2015-12-16 20:56
做的和题目“构建线程锁对象构建对象位置不同的影响”有关吗,怪我学的不精,没看出来 ...

可能是我描述的不清楚不好意思
回复 使用道具 举报
hard 发表于 2015-12-16 08:34
锁放的位置不同起到的作用是不同的,锁的应用有很多的途径,但是使用的时候要注意,是不是真的需要,有些AP ...

恩.明白了明白了谢谢谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马