A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ld5128702 中级黑马   /  2013-4-11 20:30  /  1489 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
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);

                }

               

        }

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
你原来的那个每次调用方法都会new一个Object
不管是不是同一个线程每次拿到的都是不一样的锁
而且每次都能拿到,根本不起作用

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
放在下面相当于每次累加的时候都会新new出一把新的锁(也就是obj)。
要让线程锁住,必须是同一把锁。
定义在方法里面的是局部变量,每次运行都会新产生,运行结束都会自动销毁,所以new Object()不能写在方法里,而要写在类里面.

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
同步的前提:
1.必须要有两个或者两个以上的线程才需要同步。
2.必须是多个线程使用同一个锁
如你提供的代码所示,obj对象就充当了一个锁
但是
如果把Object obj=new Object();放在方法里面,每个线程进入add方法后都会去new一个obj锁,这就破坏了同步前提的第二个条件,即,没有满足多个线程使用同一个锁。
回复 使用道具 举报
明白了,谢谢各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马