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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hejinzhong 中级黑马   /  2014-7-20 15:24  /  859 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hejinzhong 于 2014-7-20 15:30 编辑

  1. <p> class Bank
  2. {
  3.      private int sum=0;</p><p>     public void add(int n)
  4.      {
  5.           sum = sum + n;
  6.   
  7.           try
  8.           {
  9.                Thread.sleep(10);   
  10.           }
  11.           catch (Exception e)
  12.           {
  13.           }
  14.           System.out.println("sum="+sum);
  15.      }
  16. }</p><p>class Cus implements Runnable
  17. {
  18.      private Bank b = new Bank();
  19.      public void run()
  20.      {
  21.           Object obj = new Object();
  22.           for(int i=0;i<3;i++)
  23.           {
  24.                synchronized(obj)
  25.                {
  26.                        b.add(100);//  这里有锁,不是函数add执行完,其他才能进来吗,为什么结果不对?
  27.                }
  28.           }
  29.       }
  30. }</p><p>class SynchronizedDemo
  31. {
  32.      public static void main(String[] args)
  33.      {
  34.               Cus c = new Cus();
  35.               Thread t0 = new Thread(c);
  36.               Thread t1 = new Thread(c);
  37.               t0.start();
  38.               t1.start();
  39.       }
  40. }</p>
复制代码


3 个回复

倒序浏览
因为你把  Object obj = new Object();写在了run方法内部,这样每个线程都会有一个自己的obj,这就会导致两个线程的锁是不同的,当然没有同步效果。将这句代码移出run方法外,变为Cus类的成员变量,就可以实现同步。
回复 使用道具 举报
楼上回答正确,,
同步的两个条件之一是不同县城用的是同一个对象锁
看起来你好像只有一个OBJ,其实你是每条线程都建立了不同的OBJECT对象,所以你要定义在类成员位置才能保证你使用的是同一个锁,
如果你使用两个不同的对象来创建线程的话,还需要将锁STATIC,否则他们也是每个对象里面都有自己的OBJECT对象,
回复 使用道具 举报
ddewym123 发表于 2014-7-20 16:50
因为你把  Object obj = new Object();写在了run方法内部,这样每个线程都会有一个自己的obj,这就会导致两 ...

恩。没注意到我把他放到局部了!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马