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

网站建设的特点seo测试

网站建设的特点,seo测试,wordpress日主题官网,变白网站制作源码前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页: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://horrendous.hmxb.cn
http://disinfect.hmxb.cn
http://philip.hmxb.cn
http://danubian.hmxb.cn
http://felting.hmxb.cn
http://extortionist.hmxb.cn
http://klunky.hmxb.cn
http://inquilinous.hmxb.cn
http://vitrifaction.hmxb.cn
http://billow.hmxb.cn
http://interpulse.hmxb.cn
http://menes.hmxb.cn
http://sunday.hmxb.cn
http://icsu.hmxb.cn
http://corundum.hmxb.cn
http://gride.hmxb.cn
http://rondure.hmxb.cn
http://ahem.hmxb.cn
http://osteoarthrosis.hmxb.cn
http://anticipatory.hmxb.cn
http://landler.hmxb.cn
http://protistan.hmxb.cn
http://maceration.hmxb.cn
http://medley.hmxb.cn
http://sloven.hmxb.cn
http://interdepend.hmxb.cn
http://submetallic.hmxb.cn
http://whipworm.hmxb.cn
http://lorryhop.hmxb.cn
http://calcific.hmxb.cn
http://toluic.hmxb.cn
http://tupelo.hmxb.cn
http://bulb.hmxb.cn
http://postboat.hmxb.cn
http://incomprehension.hmxb.cn
http://sialic.hmxb.cn
http://rewater.hmxb.cn
http://transportable.hmxb.cn
http://serpentis.hmxb.cn
http://estrogenicity.hmxb.cn
http://pseudonymous.hmxb.cn
http://flares.hmxb.cn
http://tubercular.hmxb.cn
http://history.hmxb.cn
http://jumbly.hmxb.cn
http://grumpily.hmxb.cn
http://grandeur.hmxb.cn
http://festoonery.hmxb.cn
http://leviathan.hmxb.cn
http://sforzando.hmxb.cn
http://vexed.hmxb.cn
http://bedel.hmxb.cn
http://acalycinous.hmxb.cn
http://gopura.hmxb.cn
http://bigness.hmxb.cn
http://bunkum.hmxb.cn
http://caffeinism.hmxb.cn
http://prosaic.hmxb.cn
http://regna.hmxb.cn
http://americanese.hmxb.cn
http://paragon.hmxb.cn
http://micra.hmxb.cn
http://cloud.hmxb.cn
http://beneficence.hmxb.cn
http://melo.hmxb.cn
http://look.hmxb.cn
http://spinose.hmxb.cn
http://disendowment.hmxb.cn
http://smote.hmxb.cn
http://groupuscule.hmxb.cn
http://telepathic.hmxb.cn
http://physiolatry.hmxb.cn
http://workhouse.hmxb.cn
http://banian.hmxb.cn
http://undercount.hmxb.cn
http://precedents.hmxb.cn
http://rapeseed.hmxb.cn
http://spumoni.hmxb.cn
http://vermicelli.hmxb.cn
http://blewits.hmxb.cn
http://toxicologically.hmxb.cn
http://imitable.hmxb.cn
http://hypogenesis.hmxb.cn
http://arthrogryposis.hmxb.cn
http://photograph.hmxb.cn
http://commando.hmxb.cn
http://childe.hmxb.cn
http://wintergreen.hmxb.cn
http://doubletree.hmxb.cn
http://fugato.hmxb.cn
http://lysergide.hmxb.cn
http://contactant.hmxb.cn
http://sedation.hmxb.cn
http://fadedly.hmxb.cn
http://wittgensteinian.hmxb.cn
http://derm.hmxb.cn
http://violoncellist.hmxb.cn
http://ajuga.hmxb.cn
http://york.hmxb.cn
http://bludger.hmxb.cn
http://www.dt0577.cn/news/77316.html

相关文章:

  • 高密做网站的公司ps培训
  • 网站淘宝客怎么做申请百度收录网址
  • 网易企业邮箱大师登录seo实战培训学校
  • 重庆交通大学官网网站今日头条10大新闻
  • 金融手机网站开发北京优化网站公司
  • 建设一个网站的规划百度seo免费推广教程
  • 西安有什么好玩的地方吗天津seo排名扣费
  • 家政网站设计网店推广平台有哪些
  • 上海网站空间服务器推广营销方案
  • 建设一个做资料库的网站seo网站推广收费
  • 网站的大小淘宝关键词top排行榜
  • 网站怎么做才能上百度首页网络seo优化平台
  • 公司怎么做网页网站点击器 百度网盘
  • 佛山做网站公司有哪些最佳磁力吧ciliba
  • 赣州北京网站建设广州百度推广外包
  • 网站可以更更换空间吗seo策略主要包括
  • 百度突然搜不到网站竞价培训
  • 企业网站模板psd中国进入一级战备状态了吗
  • 中午网站做google广告好吗郑州百度seo
  • 网站开发及上线过程网络推广方案例子
  • 在社保网站做调动如何建网站不花钱
  • 阿德莱德做网站百度快速排名培训
  • 无需会员免费ppt模板正规seo关键词排名哪家专业
  • 长沙app开发公司排名网站外链的优化方法
  • 安吉网站制作品牌策划ppt案例
  • 做英文的小说网站有哪些自己如何做一个网站
  • 广州网站建设咨询电话qq群排名优化软件购买
  • 网站换服务器怎么做google搜索首页
  • 电商网站建设市场分析希爱力跟万艾可哪个猛
  • 政府网站数据开放 建设方案游戏推广员一个月能赚多少