黑马程序员技术交流社区

标题: 同步问题 [打印本页]

作者: ld5128702    时间: 2013-4-11 20:30
标题: 同步问题
本帖最后由 ld5128702 于 2013-4-12 00:43 编辑
  1. class Bank
  2. {
  3.         private int sum;
  4.         Object obj=new Object();
  5.         public void add(int n)
  6.         {
  7.                 //Object obj=new Object();刚才把这个给放在这里了,结果没起到作用,求高手给解释一下和上面正确位置的区别
  8.                 synchronized(obj)
  9.                 {
  10.                         sum=sum+n;
  11.                         System.out.println("sum:"+sum);
  12.                 }
  13.                
  14.         }
  15. }
  16. class Cus implements Runnable
  17. {
  18.         private Bank b=new Bank();
  19.         public void run()
  20.         {
  21.                 for(int i=0;i<3;i++)
  22.                 {
  23.                         b.add(100);
  24.                         
  25.                 }
  26.                
  27.         }
  28. }
  29. class Demo02
  30. {
  31.         public static void main(String args[])
  32.         {
  33.                 Cus c=new Cus();
  34.                 Thread t1=new Thread(c);
  35.                 Thread t2=new Thread(c);
  36.                 t1.start();
  37.                 t2.start();
  38.         }
  39. }
复制代码

作者: 赵晓东    时间: 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