黑马程序员技术交流社区

标题: 多线程同步的小问题 [打印本页]

作者: filter    时间: 2012-12-15 09:24
标题: 多线程同步的小问题
本帖最后由 李志阳 于 2012-12-16 08:47 编辑
  1. package it.cast;

  2. class Bank{
  3.         private int sum;
  4.         Object obj = new Object();
  5.         public void add(int n)
  6.         {
  7.                 synchronized(obj)
  8.                 {
  9.                         sum = sum + n;
  10.                         try
  11.                         {
  12.                                 Thread.sleep(10);
  13.                         }
  14.                         catch (Exception e)
  15.                         {
  16.                         }
  17.                         System.out.println("sum="+sum);
  18.                 }
  19.         }
  20. }

  21. class Cus implements Runnable
  22. {
  23.         private Bank b = new Bank();
  24.         public void run()
  25.         {
  26.                 for (int x = 0; x < 3; x++)
  27.                 {
  28.                         b.add(100);
  29.                 }
  30.         }
  31. }
  32. class  BankDemo
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                 Cus c = new Cus();
  37.                 Thread t1 = new Thread(c);
  38.                 Thread t2 = new Thread(c);
  39.                 t1.start();
  40.                 t2.start();
  41.         }
  42. }


复制代码
视频上的例子,究竟在哪里加同步?两个线程的共享数据是哪些?
求解答,回答的越详细越好。。。。。
作者: 张胜格    时间: 2012-12-15 10:04
本帖最后由 张胜格 于 2012-12-15 10:07 编辑

03.class Bank{

04.        private int sum;

05.        Object obj = new Object();

06.        public void add(int n)

07.        {

08.                synchronized(obj)

09.                {

10.                        sum = sum + n;

11.                        try

12.                        {

13.                                Thread.sleep(10);

14.                        }

15.                        catch (Exception e)

16.                        {

17.                        }

18.                        System.out.println("sum="+sum);

19.                }

20.        }

21.}
红色部分是同步代码块,即是加同步的部分,意思是说当一个线程执行这段代码时别的线程就不能执行了,
共享的数据其实就是同步代码块中的数据,这里是sum,这样当sum在一个线程中值改变时,就不会影响其它的线程中的数据了
作者: filter    时间: 2012-12-15 10:13
张胜格 发表于 2012-12-15 10:04
03.class Bank{

04.        private int sum;

23.class Cus implements Runnable

24.{

25.        private Bank b = new Bank();

26.        public void run()

27.        {

28.                for (int x = 0; x < 3; x++)

29.                {

30.                        b.add(100);

31.                }

32.        }

33.}

谢谢,但是这一块代码呢?run方法部分为什么不是属于同步代码呢?
作者: 李培根    时间: 2012-12-15 10:19
李志阳 发表于 2012-12-15 10:13
23.class Cus implements Runnable

24.{

这个要弄明白同步的原因就好,需要加同步的地方是两个线程同时操作的地方,因为同时操作一个线程操作的时候另一个线程不能同时操作,run方法只是对资源操作的方式。操作什么就对什么加同步就好。

作者: filter    时间: 2012-12-15 10:30
两个线程操作的是同一个对象Cus c = new Cus();,for循环部分为什么不是同步代码呢??


作者: 张胜格    时间: 2012-12-15 10:31
楼上说的很对,其实你应该先弄明白同步的原理和使用同步的原因,这样这样的代码就好懂了。




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