死锁

2019-07-07 23:44 更新

过多的同步方法可能造成死锁。 MyThread:主程序。 Test1:卖家。 Test2:买家。 场景:一手给钱,一手给货,两者都拿着各自的锁不松手。造成死锁,无输出。

  1. public class MyThread{
  2. public static void main(String[] args) throws InterruptedException {
  3. Object goods = new Object();
  4. Object money = new Object();
  5. Test1 t1 = new Test1(goods, money);
  6. Test2 t2 = new Test2(goods, money);
  7. new Thread(t1).start();
  8. new Thread(t2).start();
  9. }
  10. }
  11. class Test1 implements Runnable {
  12. Object goods;
  13. Object money;
  14. public Test1(Object goods, Object money) {
  15. this.goods = goods;
  16. this.money = money;
  17. }
  18. @Override
  19. public void run() {
  20. while(true) {
  21. test();
  22. }
  23. }
  24. public void test() {
  25. synchronized(goods) {
  26. try {
  27. Thread.sleep(500);
  28. } catch (InterruptedException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. synchronized (money) {
  33. }
  34. //注:这里已经有了商品,即Test1是卖家,需要给钱才能给货(goods的锁)。
  35. System.out.println("一手给钱");
  36. }
  37. }
  38. }
  39. class Test2 implements Runnable {
  40. Object goods;
  41. Object money;
  42. public Test2(Object goods, Object money) {
  43. this.goods = goods;
  44. this.money = money;
  45. }
  46. @Override
  47. public void run() {
  48. while(true) {
  49. test();
  50. }
  51. }
  52. public void test() {
  53. synchronized(money) {
  54. try {
  55. Thread.sleep(500);
  56. } catch (InterruptedException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. synchronized (goods) {
  61. }
  62. //注:这里已经有了钱,即Test2是买家,需要给货才能给钱(money的锁)。
  63. System.out.println("一手给货");
  64. }
  65. }
  66. }
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号