黑马程序员技术交流社区
标题:
同步线程的锁,真把我搞晕了。
[打印本页]
作者:
337091921
时间:
2013-5-12 03:00
标题:
同步线程的锁,真把我搞晕了。
本帖最后由 337091921 于 2013-5-12 18:27 编辑
为什么创建对象的位置不同,锁就不同啊。输出结果更不同啊?
class test
{
public static void main(String args [])
{
tic ti=new tic();
//tic tii=new tic();
Thread t=new Thread(ti,"线程一");
Thread t1=new Thread(ti,"线程二");
Thread t2=new Thread(ti,"线程三");
Thread t3=new Thread(ti,"线程四");
t.start();
t1.start();
t2.start();
t3.start();
}
}
class tic implements Runnable
{
private int num=100;
objectt obj =new object();//为什么要放这啊,放下面就不可以呢?
public void run(){
//objectt obj =new object();
while(true){
synchronized (obj){
if(num>0){
try
{Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+" ======="+num--);
}
}
}
}
}
作者:
白磊
时间:
2013-5-12 08:00
首先,不论是同步代码块还是同步方法,都会损失一些效率,所以应该根据线程可能出现问题的地方加上同步。所以,同步里的代码越少越好。
其次,Object obj=new Object();这本来就是用任意一个对象来加锁的,所以只要有一个对象就行了,放下面的话,这不是每执行一次run()方法,都会创建一个对象了,没这个必要。
至于你说输出结果不同,这个很正常啊,可能每次的输出结果都不同的啊,本来就是看他们谁运气好,能显得到锁并得到cpu。
作者:
江南雨
时间:
2013-5-12 08:18
如果你放在run方法里面就会不止一个obj了,那就不是唯一的了,你又怎么可能实现同步呢!!
作者:
Oyxiaoxi
时间:
2013-5-12 09:31
我也不是很清楚,希望有人解决… 学习下…
作者:
刘胜寒
时间:
2013-5-12 10:10
输出结果不同,这个看运气的。。。和多线程代码没有什么必然的联系。
你的tic类实现了Runnable接口,也是说你的四个线程执行的是同一个对象。
你的obj如果放在了run方法里面就是成为另一个零时变量。就会不会实现你想要的结果了。
如果放在里面了可能你会打出四个2出来或许其他情况。
多线程同享资源时,一定要把锁设置成共享的。如果你把obj放到run里面,obj就不会共享了。就会出问题。
位置放在那个地方不重要,共享才是重要的。
作者:
刘胜寒
时间:
2013-5-12 10:12
楼主记得即使结贴哦!不明白可以继续提问。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2