Java 多线程实现死锁场景 (r) - Go语言中文社区

Java 多线程实现死锁场景 (r)


《Java 编程思想》  P718 ~ P722

模拟死锁的场景, 三个人 三根筷子,每个人需要拿到身边的两根筷子才能开始吃饭

出现死锁的场景是,三个人都拿到了右边的筷子,但是由于筷子都被抢占,均无法获得左边的筷子



Chopstick.java

[java] view plain copy
  1. package com.anialy.test.multithread.philosophers;  
  2.   
  3. public class Chopstick {  
  4.     private boolean taken = false;  
  5.       
  6.     public synchronized void take() throws InterruptedException{  
  7.         while(taken)   //如果被拿
  8.             wait();  
  9.         taken = true;  
  10.     }  
  11.       
  12.     public synchronized void drop(){  
  13.         taken = false;  //用完
  14.     }  
  15. }  


Philosopher.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.anialy.test.multithread.philosophers;  
  2.   
  3. import java.util.concurrent.TimeUnit;  
  4.   
  5. public class Philosopher implements Runnable {  
  6.   
  7.     private Chopstick left; // 左边的筷子  
  8.   
  9.     private Chopstick right; // 右边的筷子  
  10.   
  11.     public Philosopher(Chopstick left, Chopstick right){  
  12.         this.left = left;  
  13.         this.right = right;  
  14.     }  
  15.       
  16.     private void pause() throws InterruptedException {  
  17.         TimeUnit.MILLISECONDS.sleep(100);  
  18.     }  
  19.   
  20.     private void pauseToHoldChopstick() throws InterruptedException {  
  21.         TimeUnit.MILLISECONDS.sleep(1000);  
  22.     }  
  23.   
  24.     public void run() {  
  25.         try {  
  26.             while(!Thread.interrupted()) {  
  27.                 System.out.println(this + " thinking");  
  28.                 pause();  
  29.                 right.take();  
  30.                 System.out.println(this + " grabbing right");  
  31.                 // 当一个人拿起了一根筷子, 停顿一段时间,让别人也抢到各自右边的筷子  
  32.                 pauseToHoldChopstick();  
  33.                 left.take();  
  34.                 System.out.println(this + " grabbing left");  
  35.                 System.out.println(this + " eating");  
  36.                 pause();  
  37.                 // 完成之后放下筷子  
  38.                 right.drop();  
  39.                 System.out.println(this + " drop right");  
  40.                 left.drop();  
  41.                 System.out.println(this + " drop left");  
  42.             }  
  43.         } catch (InterruptedException e){  
  44.             System.out.println(this + " exiting via interrupt");  
  45.         }  
  46.     }  
  47.   
  48.   
  49. }  

死锁测试函数

DeadLockTest.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.anialy.test.multithread.philosophers;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.concurrent.ExecutorService;  
  5. import java.util.concurrent.Executors;  
  6. import java.util.concurrent.TimeUnit;  
  7.   
  8. public class DeadLockTest {  
  9.     public static void main(String[] args) throws InterruptedException, IOException {  
  10.         int size = 3;  
  11.           
  12.         ExecutorService exec = Executors.newCachedThreadPool();  
  13.         Chopstick[] sticks = new Chopstick[size];  
  14.         for(int i=0; i<size; i++)  
  15.             sticks[i] = new Chopstick();  
  16.           
  17.         for(int i=0; i<size; i++)  
  18.             exec.execute(new Philosopher(sticks[i]  , sticks[(i+1) % size]));     
  19.           
  20.         TimeUnit.SECONDS.sleep(50);  
  21.           
  22.         // 关掉所有的线程  
  23.         exec.shutdownNow();  
  24.     }  
  25. }  


测试如图,在每个线程拿到右边的筷子之后,都进入死锁等待状态

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/wangtaomtk/article/details/52301614
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 22:56:10
  • 阅读 ( 1257 )
  • 分类:Linux

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢