当前位置: 首页 > wzjs >正文

做阿里巴巴网站需要哪些资料郑州营销型网站建设

做阿里巴巴网站需要哪些资料,郑州营销型网站建设,wordpress支持微信登录,怎么在网站上添加地图用 Java 实现 哲学家就餐问题 这篇文章将分析死锁产生的条件,并使用 Java 实现经典的哲学家就餐问题以复现死锁,并给出解开死锁的解决方案。 (一)死锁及其产生条件 死锁是多线程编程中常见的问题,指两个或多个线程在…

用 Java 实现 哲学家就餐问题

这篇文章将分析死锁产生的条件,并使用 Java 实现经典的哲学家就餐问题以复现死锁,并给出解开死锁的解决方案。

(一)死锁及其产生条件

死锁是多线程编程中常见的问题,指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象。

死锁产生的条件可以归纳为以下四条。

  • 互斥条件(Mutual Exclusion):资源一次只能由一个线程占用,如果资源可以被共享,就不会产生死锁;
  • 占有并等待(Hold and Wait):线程在持有部分资源的情况下,又申请新的资源,新资源被其他线程持有,导致当前线程阻塞;
  • 非抢占条件(No Preemption):已分配给线程的资源不能被其他线程或操作系统强行夺取,线程持有的资源只能由线程自己释放;
  • 循环等待条件(Circular Wait):形成一个首尾相连的线程与资源的循环等待链。

(二)哲学家就餐问题及死锁复现

哲学家就餐问题是这样的:五位哲学家围坐在圆桌旁,每人左右各有一根筷子。哲学家需要两根筷子才能吃饭。吃饭前、后以及过程中可能进行思考(其实是为了模拟程序中其它代码的运行,因而这里思考时间具有随机性)。

public class DeadLock {public static class Philosopher {private final Chopstick left;private final Chopstick right;public Philosopher(Chopstick left, Chopstick right) {this.left = left;this.right = right;}public void thinkWhileDoAction(String action) throws InterruptedException {System.out.println(Thread.currentThread().getName() + " - " + action);Thread.sleep(new Random().nextInt(1000) + 1000);}public void eat() throws InterruptedException {thinkWhileDoAction("prepare to eat");synchronized (left) {thinkWhileDoAction(String.format("left %d obtained", left.number));synchronized (right) {thinkWhileDoAction(String.format("right %d obtained and eat", right.number));}}}}public static class Chopstick {public int number;}private final Philosopher[] philosophers;public DeadLock() {Chopstick[] chopsticks = new Chopstick[5];for (int i = 0; i < 5; i++) {chopsticks[i] = new Chopstick();chopsticks[i].number = i;}philosophers = new Philosopher[5];philosophers[0] = new Philosopher(chopsticks[0], chopsticks[1]);philosophers[1] = new Philosopher(chopsticks[1], chopsticks[2]);philosophers[2] = new Philosopher(chopsticks[2], chopsticks[3]);philosophers[3] = new Philosopher(chopsticks[3], chopsticks[4]);philosophers[4] = new Philosopher(chopsticks[4], chopsticks[0]);}public void eat() {for (Philosopher philosopher : philosophers) {new Thread(() -> {try {philosopher.eat();} catch (InterruptedException e) {throw new RuntimeException(e);}}).start();}}public static void main(String[] args) {DeadLock deadLock = new DeadLock();deadLock.eat();}}

通过上面的代码,我们成功的复现了死锁的发生:

Thread-1 - prepare to eat
Thread-5 - prepare to eat
Thread-4 - prepare to eat
Thread-3 - prepare to eat
Thread-2 - prepare to eat
Thread-4 - left 3 obtained
Thread-3 - left 2 obtained
Thread-2 - left 1 obtained
Thread-1 - left 0 obtained
Thread-5 - left 4 obtained

程序最终卡住,不进行任何输出。

(三)哲学家就餐问题的解决

上面提到,死锁发生的条件有四个,因此我们只需要破坏其中一个就可以了。

  1. 互斥条件的破坏(不推荐)

    • 这种方法下,我们让筷子可以被共享(如使用读写锁,允许多个哲学家同时使用同一根筷子)

    • 这与就餐问题的基本设定冲突,因为筷子必须独占使用才能进餐

  2. 占有并等待的破坏

    • 让哲学家一次性获取两根筷子,否则不获取任何筷子

      public void eat() throws InterruptedException {thinkWhileDoAction("prepare to eat");synchronized (left) {synchronized (right) {thinkWhileDoAction(String.format("both chopsticks %d and %d obtained and eat", left.number, right.number));}}
      }
      
    • 可能导致饥饿(某些哲学家可能永远无法同时获取两根筷子)

  3. 非抢占条件的破坏

    • 使用tryLock()等可中断的锁机制

      public static class Chopstick {public int number;public Lock lock = new ReentrantLock();
      }public void eat() throws InterruptedException {thinkWhileDoAction("prepare to eat");while (true) {if (left.lock.tryLock()) {try {if (right.lock.tryLock()) {try {thinkWhileDoAction(String.format("both chopsticks %d and %d obtained and eat", left.number, right.number));return;} finally {right.lock.unlock();}}} finally {left.lock.unlock();}}}
      }
      
    • 避免死锁,更接近现实情况;实现复杂,可能降低性能

  4. 循环等待条件的破坏(这是最简单的方式!)

    • 让最后一位哲学家改变拿筷子的顺序即可

      philosophers[4] = new Philosopher(chopsticks[0], chopsticks[4]);
      
    • 实现简单,保证不会形成循环等待链

http://www.dtcms.com/wzjs/226671.html

相关文章:

  • 绍兴网站优化无锡网站建设方案优化
  • 建设网站的工作步骤网站软件免费下载
  • 盐城网站优化价格营销型网站建设需要多少钱
  • 网站中的动态统计图如何做珠海网站设计
  • wordpress模板之家seo排名优化工具推荐
  • 大流量网站开发怎么创建域名
  • 《c程序设计》精品课程网站建设广州推动优化防控措施落地
  • 网站开发平台软件湖南长沙seo
  • 做花酒的网站seo tdk
  • 新动力网站建设公司知乎营销平台
  • 太原网站建设团队站内推广有哪些具体方式
  • 做自我介绍的网站的图片素材做推广的软件有哪些
  • 756ka网站建设关键词搜索名词解释
  • 邯郸做移动网站价格百度云资源链接分享群组
  • 福建省住房城乡和建设厅网站广州网站seo推广
  • 公众号开发哪家专业定西seo排名
  • 网页传奇哪个最火狼雨的seo教程
  • 大型电商网站开发方案哪有网页设计公司
  • 长沙教育类网站建设链网
  • 山西省网站怎么查搜索关键词排名
  • wordpress 增加其它语言自媒体seo优化
  • 固安县建设局网站什么是交换链接
  • 网站频道建设需要优化的网站有哪些
  • 做海报的软件app免费河南seo快速排名
  • 做网站先做前端好还是先做逻辑适合发表个人文章的平台
  • 单位建设网站注意点北京快速优化排名
  • 网站制作公司转型数据搜索竞价排名
  • 建一个类似淘宝的网站需要多少钱承德网络推广
  • 一站式做网站多少钱国外网站seo免费
  • 北京网站建设公司排名无货源电商怎么做