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

© hejinzhong 中级黑马   /  2014-8-14 22:56  /  1421 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. /**
  2. * Java线程:并发协作-死锁
  3. */
  4. public class Test {
  5.         public static void main(String[] args) {
  6.                 DeadlockRisk dead = new DeadlockRisk();
  7.                 MyThread t1 = new MyThread(dead, 1, 2);
  8.                 MyThread t2 = new MyThread(dead, 3, 4);
  9.                 MyThread t3 = new MyThread(dead, 5, 6);
  10.                 MyThread t4 = new MyThread(dead, 7, 8);

  11.                 t1.start();
  12.                 t2.start();
  13.                 t3.start();
  14.                 t4.start();
  15.         }

  16. }

  17. class MyThread extends Thread {
  18.         private DeadlockRisk dead;
  19.         private int a, b;


  20.         MyThread(DeadlockRisk dead, int a, int b) {
  21.                 this.dead = dead;
  22.                 this.a = a;
  23.                 this.b = b;
  24.         }

  25.         @Override
  26.         public void run() {
  27.                 dead.read();
  28.                 dead.write(a, b);
  29.         }
  30. }

  31. class DeadlockRisk {
  32.         private static class Resource {
  33.                 public int value;
  34.         }

  35.         private Resource resourceA = new Resource();
  36.         private Resource resourceB = new Resource();

  37.         public int read() {
  38.                 synchronized (resourceA) {
  39.                         System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceA的锁!");
  40.                         synchronized (resourceB) {
  41.                                 System.out.println("read():" + Thread.currentThread().getName() + "获取了resourceB的锁!");
  42.                                 return resourceB.value + resourceA.value;
  43.                         }
  44.                 }
  45.         }

  46.         public void write(int a, int b) {
  47.                 synchronized (resourceB) {
  48.                         System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!");
  49.                         synchronized (resourceA) {
  50.                                 System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceB的锁!");
  51.                                 resourceA.value = a;
  52.                                 resourceB.value = b;
  53.                         }
  54.                 }
  55.         }
  56. }
复制代码

5 个回复

倒序浏览
我还是喜欢Oracle官方的死锁示例,简单而有趣
  1. /**
  2. * 死锁示例:
  3. *         张三李四相互鞠躬问候。
  4. *                 张三看到李四向自己鞠躬后,就鞠躬回礼(调用李四的bowBack方法)。
  5. *                 李四看到张三向自己鞠躬后,也鞠躬回礼(调用张三的bowBack方法)。
  6. *                 张三拿着张三对象的锁,想调李四的bowBack方法
  7. *                 李四拿着李四对象的锁,想调张三的bowBack方法
  8. *                 互相拿着对方需要的锁,造成死锁
  9. *
  10. * @author lihao
  11. *
  12. */
  13. public class DeadlockDemo {
  14.    
  15.     public static void main(String[] args) {
  16.         final Friend zhangsan = new Friend("张三");
  17.         final Friend lisi = new Friend("李四");

  18.         Thread t1 = new Thread(new Runnable() {
  19.             public void run() { zhangsan.bow(lisi); }
  20.         }); // 张三向李四鞠躬

  21.         Thread t2 = new Thread(new Runnable() {
  22.             public void run() { lisi.bow(zhangsan); }
  23.         }); // 李四向张三鞠躬
  24.         
  25.         t1.start();
  26.         t2.start();
  27.     }
  28. }

  29. class Friend {
  30.         private String name;
  31.         public Friend(String name) {
  32.             this.name = name;
  33.         }
  34.         public String getName() {
  35.             return this.name;
  36.         }
  37.         public synchronized void bow(Friend bower) {
  38.                 System.out.println(this.name + "说:" + bower.getName() + "向我鞠躬问候了");
  39.             bower.bowBack(this);
  40.         }
  41.         public synchronized void bowBack(Friend bower) {
  42.                 System.out.println(this.name + "说:" + bower.getName() + "向我鞠躬回礼了");
  43.         }
  44.     }
复制代码
回复 使用道具 举报
fantacyleo 发表于 2014-8-14 22:58
我还是喜欢Oracle官方的死锁示例,简单而有趣

你前面提到了一些,java中支持的几种数据类型转换,有没有详细介绍,我想看看。和这里没关系的
回复 使用道具 举报
hejinzhong 发表于 2014-8-17 22:11
你前面提到了一些,java中支持的几种数据类型转换,有没有详细介绍,我想看看。和这里没关系的 ...

你指的是这个帖子里讲的几种自动类型转换?http://bbs.itheima.com/thread-132498-1-1.html
回复 使用道具 举报
提前复习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马