黑马程序员技术交流社区
标题:
同步问题
[打印本页]
作者:
ld5128702
时间:
2013-4-11 20:30
标题:
同步问题
本帖最后由 ld5128702 于 2013-4-12 00:43 编辑
class Bank
{
private int sum;
Object obj=new Object();
public void add(int n)
{
//Object obj=new Object();刚才把这个给放在这里了,结果没起到作用,求高手给解释一下和上面正确位置的区别
synchronized(obj)
{
sum=sum+n;
System.out.println("sum:"+sum);
}
}
}
class Cus implements Runnable
{
private Bank b=new Bank();
public void run()
{
for(int i=0;i<3;i++)
{
b.add(100);
}
}
}
class Demo02
{
public static void main(String args[])
{
Cus c=new Cus();
Thread t1=new Thread(c);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
复制代码
作者:
赵晓东
时间:
2013-4-11 20:37
public void add(int n)
{
//Object obj=new Object();//你放在这个位置,线程A进来new了另一个Object,拿到锁了,然后B线程有进来又new了一个Object又拿到了obj锁,所以没起作用
synchronized(obj)
{
sum=sum+n;
System.out.println("sum:"+sum);
}
}
作者:
蓝色骨头
时间:
2013-4-11 21:03
你原来的那个每次调用方法都会new一个Object
不管是不是同一个线程每次拿到的都是不一样的锁
而且每次都能拿到,根本不起作用
作者:
范鹏飞
时间:
2013-4-11 21:54
放在下面相当于每次累加的时候都会新new出一把新的锁(也就是obj)。
要让线程锁住,必须是同一把锁。
定义在方法里面的是局部变量,每次运行都会新产生,运行结束都会自动销毁,所以new Object()不能写在方法里,而要写在类里面.
作者:
gerenvip
时间:
2013-4-11 23:30
同步的前提:
1.必须要有两个或者两个以上的线程才需要同步。
2.必须是多个线程使用同一个锁
如你提供的代码所示,obj对象就充当了一个锁
但是
如果把Object obj=new Object();放在方法里面,每个线程进入add方法后都会去new一个obj锁,这就破坏了同步前提的第二个条件,即,没有满足多个线程使用同一个锁。
作者:
ld5128702
时间:
2013-4-12 00:43
明白了,谢谢各位
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2