黑马程序员技术交流社区
标题:
同步锁这么加为什么不行?
[打印本页]
作者:
hejinzhong
时间:
2014-7-20 15:24
标题:
同步锁这么加为什么不行?
本帖最后由 hejinzhong 于 2014-7-20 15:30 编辑
<p> class Bank
{
private int sum=0;</p><p> public void add(int n)
{
sum = sum + n;
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println("sum="+sum);
}
}</p><p>class Cus implements Runnable
{
private Bank b = new Bank();
public void run()
{
Object obj = new Object();
for(int i=0;i<3;i++)
{
synchronized(obj)
{
b.add(100);// 这里有锁,不是函数add执行完,其他才能进来吗,为什么结果不对?
}
}
}
}</p><p>class SynchronizedDemo
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t0 = new Thread(c);
Thread t1 = new Thread(c);
t0.start();
t1.start();
}
}</p>
复制代码
作者:
ddewym123
时间:
2014-7-20 16:50
因为你把 Object obj = new Object();写在了run方法内部,这样每个线程都会有一个自己的obj,这就会导致两个线程的锁是不同的,当然没有同步效果。将这句代码移出run方法外,变为Cus类的成员变量,就可以实现同步。
作者:
215041631
时间:
2014-7-20 17:00
楼上回答正确,,
同步的两个条件之一是不同县城用的是同一个对象锁
看起来你好像只有一个OBJ,其实你是每条线程都建立了不同的OBJECT对象,所以你要定义在类成员位置才能保证你使用的是同一个锁,
如果你使用两个不同的对象来创建线程的话,还需要将锁STATIC,否则他们也是每个对象里面都有自己的OBJECT对象,
作者:
hejinzhong
时间:
2014-7-20 17:46
ddewym123 发表于 2014-7-20 16:50
因为你把 Object obj = new Object();写在了run方法内部,这样每个线程都会有一个自己的obj,这就会导致两 ...
恩。没注意到我把他放到局部了!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2