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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨千里 于 2012-9-23 16:59 编辑

class Ticket1 implements Runnable//extends Thread
{
private  int tick = 1000;
Object obj = new Object();      // 创建个对象,这对象相当于 “锁”。//Object obj = new  Object ()
public void run()
{
  while(true)
  {
   synchronized(obj)  //这个锁在这里用,感觉创建个对象有点麻烦,所以上面的 Object  obj = new Object();这句话不写,obj直接换成 new Object()  即synchroied(new object())
   {                                                                            // synchronized(new Object())  编译没有错误,运行结果有负数?  why?难道这样写,锁没有加成功?
    if(tick>0)
    {
     try
     {
          Thread.sleep(10);
     }
     catch(Exception e)
     {
      
     }
        System.out.println(Thread.currentThread().getName()+" sale : " + tick--);
    }
   
   }
  }
}

}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
synchroied(new object()) 关于里边的(new object())貌似必须是已知存在的,也可以写Ticket1.class之类的;
(new object())编译没问题,运行时侯会发现它并不存在(只是临时生成的),所以会失效;

评分

参与人数 1黑马币 +10 收起 理由
杨千里 + 10 不错 ,我懂了

查看全部评分

回复 使用道具 举报
(new Object()) 为匿名内部类了。匿名内部类甚至没有类名,(实际上有).所以匿名内部类,只有一个实例,而且没有引用.
使用范围在括号之间,同步当然是控制需要同步的代码块。 用Object  obj = new Object();可见范围达到。
回复 使用道具 举报
要想对某个代码块实现同步,则需要给这个代码块加一把锁(就是你创建的那个Object对象),并且所有要同步的线程在执行这个代码块的时候要使用相同的一把锁。你的锁在每次执行循环体的时候都是新创建的Object对象,它们当然不属于同一把锁(要属于一把锁,最起码代表这把锁的对象的引用要一样),这样自然就无法实现同步了。还有你的这把锁是否应该设置成静态常量类型的,这样在创建新的线程对象的时候也能保证他们的锁都一样
回复 使用道具 举报
楼上说得对,同步的时候需要用的是同一把锁,而使用synchronized(new Object())的话,每次都是new一个Object兑现,这样就不是同一把锁了,起不到同步的作用。
回复 使用道具 举报
使用new Object的意思就是每次循环的都是创建一把新的锁,这样监听的就不是同一把锁了!达不到资源共享的目的啦!
要想同步就必须监听同一把锁,建议楼主在好好考虑下匿名对象和实例对象的区别,以便程序无错!

评分

参与人数 1黑马币 +10 收起 理由
杨千里 + 10 明白了 谢谢

查看全部评分

回复 使用道具 举报
罗磊 中级黑马 2012-9-23 10:27:02
7#
赵永康 发表于 2012-9-23 10:17
使用new Object的意思就是每次循环的都是创建一把新的锁,这样监听的就不是同一把锁了!达不到资源共享的目 ...

是这个美女所描述的原因!顶下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马