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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heheka123 中级黑马   /  2014-3-31 14:12  /  1147 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
  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都是同一个就可以使线程同步。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为是对象锁...   
回复 使用道具 举报
//毕老师视频里面讲 这里随便一个对象都可以 为什么啊  这个同步锁道德怎么回事啊 没怎么懂?               
代码就不贴了 就你的问题回答一下 是我自己的理解有可能是错的
java要用到同步的话 就得有锁 可是什么是锁呢 java就表示了任何对象都可以定义成锁(锁是一个概念的东西)并拥有wait noitfy notifyAll 方法来实现同步机制中避免发生死锁的方法 而每个对象都可以使锁
那就给Object 理由很简单 Object是所有对象的父类 也就是毕老师所讲的"上帝" 所有对象都集成了Object 那就让Object 拥有锁的操作方法 这样子所有的对象不都拥有了吗
以上是我的理解不知道啊能帮助你

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马