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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄陂酷歌 中级黑马   /  2014-3-22 14:03  /  1047 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Bank{
  2.         private int sum;
  3.         Object obj = new Object();
  4.         public synchronized void add(int n){  //同步为什么在这个位置
  5.                 sum = sum + n;
  6.                 try{Thread.sleep(10);}catch(Exception e){};
  7.                 System.out.println("sum="+sum);
  8.         }
  9. }
  10. class Cus implements Runnable{
  11.         private Bank b = new Bank();
  12.         public void run(){    //为什么这个位置不需要同步
  13.                 for(int x=0;x<3;x++)
  14.                         b.add(100);
  15.         }
  16. }
  17. class ThreadDemo{
  18.         public static void main(String[] args){
  19.                 Cus c = new Cus();
  20.                 Thread t1 = new Thread(c);
  21.                 Thread t2 = new Thread(c);
  22.                 t1.start();
  23.                 t2.start();
  24.         }
  25. }
复制代码

毕老师说只有一条语句的位置不需要同步,有一条以上的语句且有共享数据的时候才要同步,是这样的吗?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

1 个回复

倒序浏览
本帖最后由 my_android_drea 于 2014-3-22 16:08 编辑

上面的回复出现问题了!!!!显示不了,无语


因为这里可能会出现问题,毕老师用sleep(10)让这个问题产生。当一个线程进入执行了 sum=sum+n 后,这时假如  sum=200 (注意:没执行下一句打印啊),  接着该线程sleep,  另一线程此时进来并执行了  sum=sum+n  这时  sum=300   等线程“醒”后,执行下一句,打印 ,这时打印出来的  sum=300  而不是200!  那么显示的结果就有问题啦!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马