黑马程序员技术交流社区

标题: 关于线程同步同步代码位置的问题 [打印本页]

作者: 黄陂酷歌    时间: 2014-3-22 14:03
标题: 关于线程同步同步代码位置的问题
  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. }
复制代码

毕老师说只有一条语句的位置不需要同步,有一条以上的语句且有共享数据的时候才要同步,是这样的吗?
作者: my_android_drea    时间: 2014-3-22 16:05
本帖最后由 my_android_drea 于 2014-3-22 16:08 编辑

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


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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2