亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java實(shí)現(xiàn)死鎖的示例代碼

 更新時(shí)間:2018年01月24日 16:44:23   作者:土豆Z120553  
本篇文章主要介紹了java實(shí)現(xiàn)死鎖的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

什么是死鎖

我們先看看這樣一個(gè)生活中的例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車通過(guò),無(wú)法讓兩輛汽車并行。如果有兩輛汽車A和B分別由橋的兩端駛上該橋,則對(duì)于A車來(lái)說(shuō),它走過(guò)橋面左面的一段路(即占有了橋的一部分資源),要想過(guò)橋還須等待B車讓出右邊的橋面,此時(shí)A車不能前進(jìn);對(duì)于B車來(lái)說(shuō),它走過(guò)橋面右邊的一段路(即占有了橋的一部分資源),要想過(guò)橋還須等待A車讓出左邊的橋面,此時(shí)B車也不能前進(jìn)。兩邊的車都不倒車,結(jié)果造成互相等待對(duì)方讓出橋面,但是誰(shuí)也不讓路,就會(huì)無(wú)休止地等下去。這種現(xiàn)象就是死鎖。如果把汽車比做進(jìn)程,橋面作為資源,那麼上述問(wèn)題就描述為:進(jìn)程A占有資源R1,等待進(jìn)程B占有的資源Rr;進(jìn)程B占有資源Rr,等待進(jìn)程A占有的資源R1。而且資源R1和Rr只允許一個(gè)進(jìn)程占用,即:不允許兩個(gè)進(jìn)程同時(shí)占用。結(jié)果,兩個(gè)進(jìn)程都不能繼續(xù)執(zhí)行,若不采取其它措施,這種循環(huán)等待狀況會(huì)無(wú)限期持續(xù)下去,就發(fā)生了進(jìn)程死鎖。

在計(jì)算機(jī)系統(tǒng)中,涉及軟件,硬件資源都可能發(fā)生死鎖。例如:系統(tǒng)中只有一臺(tái)CD-ROM驅(qū)動(dòng)器和一臺(tái)打印機(jī),某一個(gè)進(jìn)程占有了CD-ROM驅(qū)動(dòng)器,又申請(qǐng)打印機(jī);另一進(jìn)程占有了打印機(jī),還申請(qǐng)CD-ROM。結(jié)果,兩個(gè)進(jìn)程都被阻塞,永遠(yuǎn)也不能自行解除。

所謂死鎖,是指多個(gè)進(jìn)程循環(huán)等待它方占有的資源而無(wú)限期地僵持下去的局面。很顯然,如果沒(méi)有外力的作用,那麼死鎖涉及到的各個(gè)進(jìn)程都將永遠(yuǎn)處于封鎖狀態(tài)。從上面的例子可以看出,計(jì)算機(jī)系統(tǒng)產(chǎn)生死鎖的根本原因就是資源有限且操作不當(dāng)。即:一種原因是系統(tǒng)提供的資源太少了,遠(yuǎn)不能滿足并發(fā)進(jìn)程對(duì)資源的需求。這種競(jìng)爭(zhēng)資源引起的死鎖是我們要討論的核心。例如:消息是一種臨時(shí)性資源。某一時(shí)刻,進(jìn)程A等待進(jìn)程B發(fā)來(lái)的消息,進(jìn)程B等待進(jìn)程C發(fā)來(lái)的消息,而進(jìn)程C又等待進(jìn)程A發(fā)來(lái)的消息。消息未到,A,B,C三個(gè)進(jìn)程均無(wú)法向前推進(jìn),也會(huì)發(fā)生進(jìn)程通信上的死鎖。另一種原因是由于進(jìn)程推進(jìn)順序不合適引發(fā)的死鎖。資源少也未必一定產(chǎn)生死鎖。就如同兩個(gè)人過(guò)獨(dú)木橋,如果兩個(gè)人都要先過(guò),在獨(dú)木橋上僵持不肯后退,必然會(huì)應(yīng)競(jìng)爭(zhēng)資源產(chǎn)生死鎖;但是,如果兩個(gè)人上橋前先看一看有無(wú)對(duì)方的人在橋上,當(dāng)無(wú)對(duì)方的人在橋上時(shí)自己才上橋,那麼問(wèn)題就解決了。所以,如果程序設(shè)計(jì)得不合理,造成進(jìn)程推進(jìn)的順序不當(dāng),也會(huì)出現(xiàn)死鎖。

死鎖

只有當(dāng)t1線程占用o1且正好也需要o2,t2此時(shí)占用o2且正好也需要o1的時(shí)候才會(huì)出現(xiàn)死鎖,(類似于2個(gè)人拿著兩個(gè)筷子吃飯,都是需要對(duì)方的一根筷子才能吃)

以下代碼t1線程占用o1,并且獲取到o2對(duì)象后才會(huì)釋放o1,而t2線程先占用o2又去獲取o1,而此時(shí)的o1被t1線程占用,o2被t2線程占用,t1和t2都在無(wú)限等待,就會(huì)出現(xiàn)死鎖。

package javasimple;
/**
 * 死鎖demo
 * @author haokui
 *
 */
public class DieSynchronized {
 public static void main(String[] args) {
  /**
   * 創(chuàng)建并啟動(dòng)兩個(gè)線程t1、t2。兩個(gè)線程都要共享o1、o2兩個(gè)對(duì)象
   */
  Object o1 = new Object();
  Object o2 = new Object();
  Thread t1 = new Thread(new T1(o1,o2));
  Thread t2 = new Thread(new T2(o1,o2));
  t1.start();
  t2.start();
 }
}
//創(chuàng)建兩個(gè)線程類
class T1 implements Runnable {
 Object o1;
 Object o2;
 public T1(Object o1, Object o2){
  this.o1 = o1;
  this.o2 = o2;
 }
 public void run() {
  //鎖o1和o2
  synchronized (o1) {
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   synchronized (o2) {
    System.out.println("o2");
   }
  }
 }
}
class T2 implements Runnable {
 Object o1;
 Object o2;
 public T2(Object o1, Object o2){
  this.o1 = o1;
  this.o2 = o2;
 }
 public void run() {
  synchronized (o2) {
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   synchronized (o1) {
    System.out.println("o1");
   }
  }
  
 }
}

注意:只有o1和o2被共享的時(shí)候才會(huì)出現(xiàn)并發(fā)的情況,可通過(guò)構(gòu)造函數(shù)的方式共享兩個(gè)對(duì)象。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot?內(nèi)置工具類的使用

    SpringBoot?內(nèi)置工具類的使用

    本文主要介紹了SpringBoot?內(nèi)置工具類的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java微信公眾號(hào)開發(fā)(搭建本地測(cè)試環(huán)境)

    java微信公眾號(hào)開發(fā)(搭建本地測(cè)試環(huán)境)

    這篇文章主要介紹了java微信公眾號(hào)開發(fā),主要內(nèi)容有測(cè)試公眾號(hào)與本地測(cè)試環(huán)境搭建,需要的朋友可以參考下
    2015-12-12
  • Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和)

    Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和)

    這篇文章主要介紹了Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 淺析Spring的JdbcTemplate方法

    淺析Spring的JdbcTemplate方法

    本篇淺析Spring的JdbcTemplate方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 枚舉java語(yǔ)言中的修飾符組合的實(shí)例代碼

    枚舉java語(yǔ)言中的修飾符組合的實(shí)例代碼

    這篇文章主要介紹了枚舉java語(yǔ)言中的修飾符組合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Mybatisplus集成springboot完成分頁(yè)查詢功能(示例代碼)

    Mybatisplus集成springboot完成分頁(yè)查詢功能(示例代碼)

    今天小編給大家分享Mybatisplus集成springboot完成分頁(yè)查詢功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-11-11
  • 詳解mybatis-plus使用@EnumValue注解的方式對(duì)枚舉類型的處理

    詳解mybatis-plus使用@EnumValue注解的方式對(duì)枚舉類型的處理

    這篇文章主要介紹了詳解mybatis-plus使用@EnumValue注解的方式對(duì)枚舉類型的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringSecurity6自定義JSON登錄的實(shí)現(xiàn)

    SpringSecurity6自定義JSON登錄的實(shí)現(xiàn)

    目前最新版的Spring Boot已經(jīng)到了3.0.5了,隨之而來(lái)Spring Security 目前的版本也到了6.0.2了,Spring Security寫法的變化特別多,本文就來(lái)介紹下,感興趣的可以了解一下
    2023-12-12
  • Java設(shè)計(jì)模式之狀態(tài)模式詳解

    Java設(shè)計(jì)模式之狀態(tài)模式詳解

    Java?中的狀態(tài)模式(State?Pattern)是一種行為型設(shè)計(jì)模式,它允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為,本文將詳細(xì)介紹?Java?中的狀態(tài)模式,我們將從狀態(tài)模式的概述、結(jié)構(gòu)與實(shí)現(xiàn)、優(yōu)缺點(diǎn)、適用場(chǎng)景等方面進(jìn)行講解,需要的朋友可以參考下
    2023-05-05
  • Java JVM編譯策略案例詳解

    Java JVM編譯策略案例詳解

    這篇文章主要介紹了Java JVM編譯策略案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論