黑马程序员技术交流社区

标题: 关于线程的同步锁,问个问题 [打印本页]

作者: heheka123    时间: 2014-3-31 14:12
标题: 关于线程的同步锁,问个问题
  1. /*
  2. 需求:储户,两个,每个都到银行存钱每次存100,,共存三次。
  3. */

  4. class Bank
  5. {
  6.         private int sum;
  7. //        private Object obj = new Object();
  8.         public synchronized void add(int num)//同步函数
  9.         {
  10. //                synchronized(obj)   //毕老师视频里面讲 这里随便一个对象都可以 为什么啊  这个同步锁道德怎么回事啊 没怎么懂?               
  11.   {
  12.                         sum = sum + num;
  13.         //                        -->
  14.                         try{Thread.sleep(10);}catch(InterruptedException e){}
  15.                         System.out.println("sum="+sum);
  16. //                }
  17.         }
  18. }


  19. class Cus implements Runnable
  20. {
  21.         private Bank b = new Bank();
  22.         public void run()
  23.         {
  24.                 for(int x=0; x<3; x++)
  25.                 {
  26.                         b.add(100);
  27.                 }
  28.         }
  29. }


  30. class BankDemo
  31. {
  32.         public static void main(String[] args)
  33.         {
  34.                 Cus c = new Cus();
  35.                 Thread t1 = new Thread(c);
  36.                 Thread t2 = new Thread(c);
  37.                 t1.start();
  38.                 t2.start();
  39.         }
  40. }
复制代码

作者: ehuashao    时间: 2014-3-31 14:47
  1. class Cus implements Runnable
  2. {
  3.         private Bank b = new Bank();
  4.         public void run()
  5.         {
  6.                 for(int x=0; x<3; x++)
  7.                 {
  8.                         b.add(100);
  9.                 }
  10.         }
  11. }
复制代码

你的这段代码里面,只生成了一个bank对象,而生成bank对象的时候
  1. private Object obj = new Object();
复制代码

会生成一个Object对象。
当两个并发线程访问同一个对象中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。所以可以看出不同线程进到函数体之前synchronized(obj)只会判断每个线程进来的时候这个obj是不是同一个对象。所以对于synchronized(obj)无论obj是哪个对象,只要保证不同线程进来的时候obj都是同一个就可以使线程同步。
作者: ノtrack    时间: 2014-3-31 15:11
因为是对象锁...   
作者: lazy_xia    时间: 2014-3-31 15:13
//毕老师视频里面讲 这里随便一个对象都可以 为什么啊  这个同步锁道德怎么回事啊 没怎么懂?               
代码就不贴了 就你的问题回答一下 是我自己的理解有可能是错的
java要用到同步的话 就得有锁 可是什么是锁呢 java就表示了任何对象都可以定义成锁(锁是一个概念的东西)并拥有wait noitfy notifyAll 方法来实现同步机制中避免发生死锁的方法 而每个对象都可以使锁
那就给Object 理由很简单 Object是所有对象的父类 也就是毕老师所讲的"上帝" 所有对象都集成了Object 那就让Object 拥有锁的操作方法 这样子所有的对象不都拥有了吗
以上是我的理解不知道啊能帮助你
作者: 枫儿    时间: 2014-4-6 19:45
楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作




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