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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王璐 中级黑马   /  2012-7-10 19:14  /  1254 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王璐 于 2012-7-10 19:42 编辑
  1. /*
  2. 需求:
  3. 银行有一个金库。
  4. 有两个储户分别存300员,每次存100,存3次。

  5. 目的:该程序是否有安全问题,如果有,如何解决?


  6. 如何找问题:
  7. 1,明确哪些代码是多线程运行代码。
  8. 2,明确共享数据。
  9. 3,明确多线程运行代码中哪些语句是操作共享数据的。
  10. */
  11. class Bank
  12. {
  13. private int sum;

  14. public synchronized void add(int n)
  15. {
  16. sum = sum + n;
  17. try{Thread.sleep(10);}catch(Exception e){}
  18. System.out.println("sum="+sum);
  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. }
复制代码
看迷糊了都,解决了

1 个回复

倒序浏览
本帖最后由 徐然 于 2012-7-10 19:49 编辑

这里的this不指向c,也不指向t1,t2;
首先需要同步的方法是add();
那么t1,t2只是开启线程,运行run()
而run方法是封装在c内的,但是c并没有直接调用add方法,
而是在内部创建了b,让b调用了add方法,那么最终,使用的this锁就是b

个人理解,不知道对不对..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马