黑马程序员技术交流社区
标题:
毕老师的同步卖票例子,有个小问题不明白?求解
[打印本页]
作者:
杨千里
时间:
2012-9-23 03:27
标题:
毕老师的同步卖票例子,有个小问题不明白?求解
本帖最后由 杨千里 于 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--);
}
}
}
}
}
作者:
胡团乐
时间:
2012-9-23 05:12
synchroied(new object()) 关于里边的(new object())貌似必须是已知存在的,也可以写Ticket1.class之类的;
(new object())编译没问题,运行时侯会发现它并不存在(只是临时生成的),所以会失效;
作者:
王胜炎
时间:
2012-9-23 07:40
(new Object()) 为匿名内部类了。匿名内部类甚至没有类名,(实际上有).所以匿名内部类,只有一个实例,而且没有引用.
使用范围在括号之间,同步当然是控制需要同步的代码块。 用Object obj = new Object();可见范围达到。
作者:
王海宇
时间:
2012-9-23 08:54
要想对某个代码块实现同步,则需要给这个代码块加一把锁(就是你创建的那个Object对象),并且所有要同步的线程在执行这个代码块的时候要使用相同的一把锁。你的锁在每次执行循环体的时候都是新创建的Object对象,它们当然不属于同一把锁(要属于一把锁,最起码代表这把锁的对象的引用要一样),这样自然就无法实现同步了。还有你的这把锁是否应该设置成静态常量类型的,这样在创建新的线程对象的时候也能保证他们的锁都一样
作者:
陈冲
时间:
2012-9-23 09:24
楼上说得对,同步的时候需要用的是同一把锁,而使用synchronized(new Object())的话,每次都是new一个Object兑现,这样就不是同一把锁了,起不到同步的作用。
作者:
赵永康
时间:
2012-9-23 10:17
使用new Object的意思就是每次循环的都是创建一把新的锁,这样监听的就不是同一把锁了!达不到资源共享的目的啦!
要想同步就必须监听同一把锁,建议楼主在好好考虑下匿名对象和实例对象的区别,以便程序无错!
作者:
罗磊
时间:
2012-9-23 10:27
赵永康 发表于 2012-9-23 10:17
使用new Object的意思就是每次循环的都是创建一把新的锁,这样监听的就不是同一把锁了!达不到资源共享的目 ...
是这个美女所描述的原因!顶下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2