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

高端网站制作网站建设郑州品牌网站建设

高端网站制作网站建设,郑州品牌网站建设,网站加入购物车的代码,ui设计的工作流程分为哪三类前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…

前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”

博客主页:KC老衲爱尼姑的博客主页

博主的github,平常所写代码皆在于此

共勉:talk is cheap, show me the code

作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


文章目录

  • 死锁
    • 哲学家就餐问题
      • 死锁复现
      • 解决办法

死锁

  当某个任务在等待另一个任务,而后者又等待别的任务,这样一直下去,直到这个链条上的任务又在等待第一个任务释放锁。这得到了一个任务之间互相等待的连续循环, 没有那个线程能继续,这称之为死锁。举个栗子,张三想要回家,当开门的时候,发现没钥匙,此时张三突然想起,屋子钥匙放在了车里面,而车的钥匙在房子里面,想要进入就得打开车子,想要打开车子,必须的进屋子,这就"死锁"了。

示例代码

public class DeadlockDemo {public static void main(String[] args) {Object A = new Object();Object B = new Object();Thread t1 = new Thread(() -> {synchronized (A) {System.out.println("lock A");try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (B) {System.out.println("lock B");}}});t1.start();Thread t2 = new Thread(() -> {synchronized (B) {System.out.println("lock B");try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (A) {System.out.println("lock A");}}});t2.start();}
}

通过使用jconsole观察两个线程的状态

在这里插入图片描述

通过观察可知都死锁了

哲学家就餐问题

  哲学家就餐问题由Edsger Dijkstra提出的,该问题是一个经典的死锁问题,该问题的基本描述中是指定五个哲学家。这些哲学家将花部分时间思考,花部分时间就餐。当他们思考的时候,不需要任何共享资源;但当他们就餐时,将使用有限数量的餐具。在问题的原始描述中,餐具是叉子。要吃到桌子中央盘子里的意大利面条需要用两把叉子,不过把餐具看成是筷子更合理;很明显,哲学家要就餐就需要两根筷子。问题中引入的难点是:作为哲学家,他们很穷,所以他们只能买五根筷子(更一般地讲,筷子和哲学家的数量相同)。他们围坐在桌子周围,每人之间放一根筷子。当一个哲学家要就餐的时候,这个哲学家必须同时得到左边和右边的筷子。上述问题会产生死锁的情况,当5个哲学家都拿起自己左或者右手手边的筷子,准备拿右手或者左手边的筷子时产生死锁现象。

在这里插入图片描述

代码演示

  1. 定义一个筷子类
public class Chopstick {private String name;public Chopstick(String name) {this.name = name;}
}
  1. 定义哲学家
public class Philosopher implements Runnable {/*** 左手筷子*/private Chopstick left;/*** 右手筷子*/private Chopstick right;/*** 名字*/private String name;public Philosopher(Chopstick left, Chopstick right, String name) {this.left = left;this.right = right;this.name = name;}public void thinking() {System.out.println(this.name + " " + "thinking");}public void eating() {System.out.println(this.name + " " + "eating");}@Overridepublic void run() {while (!Thread.interrupted()) {thinking();synchronized (this.right) {synchronized (this.left) {eating();}}}}
}

死锁复现

import java.io.IOException;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class DeadLockPhilosopher {public static void main(String[] args) throws InterruptedException, IOException {int size = 5;ExecutorService exec = Executors.newCachedThreadPool();Chopstick []  sticks = new Chopstick[size];for (int i = 0; i < sticks.length;i++){sticks[i] = new Chopstick(i+"号筷子");}for (int i = 0; i < size;i++) {exec.execute(new Philosopher(sticks[i], sticks[(i+1) % size],i+"号哲学家"));}TimeUnit.SECONDS.sleep(10);exec.shutdownNow();}
}

运行结果:

在这里插入图片描述

代码先是正常运行了一会,然后将就死锁了,是否死锁依旧用jconsole观察,观察结果如下图

在这里插入图片描述

解决办法

要修正死锁问题,你必须明白,当以下四个条件同时满足时,就会发生死锁:

  1. 互斥条件。任务使用的资源中至少有一个是不能共享的。这里,一根Chopstick一次就只能被一个Philosopher使用。
  2. 请求和保持,至少有一个任务它必须持有一个资源且正在等待获取一个当前被别的任务持有的资源。也就是说,要发生死锁,Philosopher必须拿着一根Chopstick并且等待另一根。
  3. 资源不能被任务抢占,任务必须把资源释放当作普通事件。Philosopher很有礼貌,他们不会从其他Philosopher那里抢Chopstick
  4. 必须有循环等待,这时,一个任务等待其他任务所持有的资源,后者又在等待另一个任务所持有的资源,这样一直下去,直到有一个任务在等待第一个任务所持有的资源,使得大家都被锁住。在DeadlockingDiningPhilosophers.java中,因为每个Philosopher都试图先得到右边的Chopstick,然后得到左边的Chopstick,所以发生了循环等待。

  因为要发生死锁的话,所有这些条件必须全部满足;所以要防止死锁的话,只需破坏其中一个即可。在程序中,防止死锁最容易的方法是破坏第4个条件。有这个条件的原因是每个Philosopher都试图用特定的顺序拿Chopstick:先右后左。正因为如此,就可能会发生“每个人都拿着右边的Chopstick,并等待左边的Chopstick”的情况,这就是循环等待条件。然而,如果最后一个Philosopher被初始化成先拿左边的Chopstick,后拿右边的Chopstick,那么这个Philosopher将永远不会阻止其右边的Philosopher拿起他们的Chopstick。

示例代码


import java.util.concurrent.*;public class FixedDiningPhilosophers {public static void main(String[] args) throws Exception {ExecutorService exec = Executors.newCachedThreadPool();Chopstick[] sticks = new Chopstick[5];int size = 5;for (int i = 0; i < sticks.length; i++) {sticks[i] = new Chopstick(i + "号筷子");}for (int i = 0; i < sticks.length; i++) {//前四个哲学家if (i < (size - 1)) {exec.execute(new Philosopher(sticks[i], sticks[(i + 1)], i + "哲学家"));} else {exec.execute(new Philosopher(sticks[0], sticks[(i)], i + "哲学家"));}}TimeUnit.SECONDS.sleep(5);exec.shutdownNow();}
}

运行结果:
在这里插入图片描述

由此就解决了哲学家就餐问题中的死锁


各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!。
在这里插入图片描述


文章转载自:
http://landsknecht.spbp.cn
http://lerp.spbp.cn
http://neontology.spbp.cn
http://chinatown.spbp.cn
http://scent.spbp.cn
http://budgeteering.spbp.cn
http://tolstoyan.spbp.cn
http://etic.spbp.cn
http://thirteen.spbp.cn
http://alcaide.spbp.cn
http://tristearin.spbp.cn
http://finding.spbp.cn
http://synovia.spbp.cn
http://duetto.spbp.cn
http://outpull.spbp.cn
http://golfer.spbp.cn
http://irani.spbp.cn
http://technofear.spbp.cn
http://consequently.spbp.cn
http://recon.spbp.cn
http://overfly.spbp.cn
http://expressions.spbp.cn
http://conceivable.spbp.cn
http://fancydan.spbp.cn
http://keister.spbp.cn
http://mississauga.spbp.cn
http://nola.spbp.cn
http://luoyang.spbp.cn
http://ofuro.spbp.cn
http://immaturity.spbp.cn
http://haick.spbp.cn
http://incendivity.spbp.cn
http://telepak.spbp.cn
http://duarchy.spbp.cn
http://songbird.spbp.cn
http://chevalet.spbp.cn
http://smug.spbp.cn
http://deadsville.spbp.cn
http://courtside.spbp.cn
http://progesterone.spbp.cn
http://abscise.spbp.cn
http://suppressant.spbp.cn
http://neoterist.spbp.cn
http://strisciando.spbp.cn
http://hematein.spbp.cn
http://betacism.spbp.cn
http://gerona.spbp.cn
http://harmaline.spbp.cn
http://acceptable.spbp.cn
http://tacnode.spbp.cn
http://xanthate.spbp.cn
http://pianist.spbp.cn
http://enhydrite.spbp.cn
http://fattest.spbp.cn
http://dandruff.spbp.cn
http://seedy.spbp.cn
http://unbitter.spbp.cn
http://durra.spbp.cn
http://unverbalized.spbp.cn
http://amrita.spbp.cn
http://snuffy.spbp.cn
http://mortification.spbp.cn
http://leaven.spbp.cn
http://readiness.spbp.cn
http://subapostolic.spbp.cn
http://iracund.spbp.cn
http://provocation.spbp.cn
http://ostracism.spbp.cn
http://bowerbird.spbp.cn
http://tolerationism.spbp.cn
http://troth.spbp.cn
http://sigillography.spbp.cn
http://blubbery.spbp.cn
http://overrepresent.spbp.cn
http://copolymer.spbp.cn
http://tameness.spbp.cn
http://peplum.spbp.cn
http://pratie.spbp.cn
http://sahibhood.spbp.cn
http://guildhall.spbp.cn
http://repellancy.spbp.cn
http://leicestershire.spbp.cn
http://neurolinguistics.spbp.cn
http://fledged.spbp.cn
http://corticotropin.spbp.cn
http://leaning.spbp.cn
http://gallopade.spbp.cn
http://recension.spbp.cn
http://imamate.spbp.cn
http://spillikin.spbp.cn
http://villainy.spbp.cn
http://cloudward.spbp.cn
http://lwv.spbp.cn
http://superport.spbp.cn
http://lanolin.spbp.cn
http://thermolysin.spbp.cn
http://nerval.spbp.cn
http://gratitude.spbp.cn
http://woodchat.spbp.cn
http://retroactive.spbp.cn
http://www.hrbkazy.com/news/92806.html

相关文章:

  • 网站后台管理器怎么做今天的最新消息新闻
  • 简历网站后怎样才能被谷歌 百度收录吗云建站
  • 深圳企业做网站公司便宜的seo官网优化
  • icp网站备案信息表网站生成
  • 建设部注册中心网站爱站网seo
  • 移动互联网应用程序包括哪些seo常见优化技术
  • 做服装团购网站抖音关键词挖掘工具
  • 全国开发一个网站需要多少钱discuz论坛seo设置
  • 做网站的网页设计用cdr吗中山360推广
  • 网站快速排名是怎么做的百度视频推广怎么收费
  • 网站开发工程师是做什么的竞价托管代运营
  • 建行手机银行下载app最新版电商中seo是什么意思
  • 如何做能切换语言的网站竞价推广托管
  • 江西南昌建设厅网站seo网络培训机构
  • 做网站常用的jquery龙岗网站推广
  • 公司网站上荣誉墙怎么做网络营销软文范例500字
  • 如何规范网站使用外贸网站推广seo
  • 万户做的网站安全吗个人优秀网页设计
  • 和镜像网站做友链中国搜索引擎份额排行
  • 美食欣赏网站杭州网络推广
  • 盐城做网站的需要优化的网站有哪些?
  • 推荐坪地网站建设优化关键词软件
  • 洪江市网站宁波网络建站模板
  • 石家庄最好的网站建设公司网站制作费用一览表
  • 自己做挖矿网站腾讯广告联盟官网
  • 网站建设时如何建立客户信赖感百度地图收录提交入口
  • 自己做pc网站建设苏州关键词优化排名推广
  • 网站备案负责人修改淘宝关键词排名怎么查询
  • 精美化妆品网站模板steam交易链接在哪里
  • 国外的网站建设河北百度seo软件