欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

什么是死鎖

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

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

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

死鎖

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

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

package javasimple;
/**
 * 死鎖demo
 * @author haokui
 *
 */
public class DieSynchronized {
 public static void main(String[] args) {
  /**
   * 創(chuàng)建并啟動兩個線程t1、t2。兩個線程都要共享o1、o2兩個對象
   */
  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)建兩個線程類
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被共享的時候才會出現(xiàn)并發(fā)的情況,可通過構(gòu)造函數(shù)的方式共享兩個對象。

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

相關(guān)文章

  • java實(shí)現(xiàn)置換密碼加密解密

    java實(shí)現(xiàn)置換密碼加密解密

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)置換密碼加密解密,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • spring?cloud?使用oauth2?問題匯總

    spring?cloud?使用oauth2?問題匯總

    這篇文章主要介紹了spring?cloud?使用oauth2?問題匯總,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • SpringBoot實(shí)現(xiàn)IP限流的示例代碼

    SpringBoot實(shí)現(xiàn)IP限流的示例代碼

    在高并發(fā)的互聯(lián)網(wǎng)應(yīng)用中,系統(tǒng)穩(wěn)定性面臨嚴(yán)峻挑戰(zhàn),爬蟲、以及不合理的接口調(diào)用都可能導(dǎo)致系統(tǒng)資源耗盡,影響正常用戶體驗(yàn),為了保障系統(tǒng)的穩(wěn)定性和可用性,本文將深入探討如何在 Spring Boot 中實(shí)現(xiàn) IP 限流,需要的朋友可以參考下
    2025-06-06
  • SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式

    SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式

    這篇文章主要介紹了SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java內(nèi)存泄漏排查過程及解決

    java內(nèi)存泄漏排查過程及解決

    公司某服務(wù)內(nèi)存持續(xù)增長,疑似內(nèi)存泄漏,未觸發(fā)OOM,排查方法包括檢查JVM配置、分析GC執(zhí)行狀態(tài)、導(dǎo)出堆內(nèi)存快照并用IDEA Profiler工具定位大對象及代碼
    2025-07-07
  • 基于Java實(shí)現(xiàn)考試管理系統(tǒng)

    基于Java實(shí)現(xiàn)考試管理系統(tǒng)

    這篇文章主要介紹了基于Java實(shí)現(xiàn)的考試管理系統(tǒng),項目運(yùn)用到的技術(shù)有Springboot、Maven、Jpa、Vue等等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • Java中的線程死鎖是什么?如何避免?

    Java中的線程死鎖是什么?如何避免?

    這篇文章主要介紹了Java中線程死鎖的相關(guān)資料,以及避免死鎖的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java String的intern方法使用場景示例

    Java String的intern方法使用場景示例

    這篇文章主要介紹了Java String的intern方法使用場景示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的示例代碼

    Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • Java同步關(guān)鍵字synchronize底層實(shí)現(xiàn)原理解析

    Java同步關(guān)鍵字synchronize底層實(shí)現(xiàn)原理解析

    synchronized關(guān)鍵字對大家來說并不陌生,當(dāng)我們遇到并發(fā)情況時,優(yōu)先會想到用synchronized關(guān)鍵字去解決,synchronized確實(shí)能夠幫助我們?nèi)ソ鉀Q并發(fā)的問題,接下來通過本文給大家分享java synchronize底層實(shí)現(xiàn)原理,感興趣的朋友一起看看吧
    2021-08-08

最新評論