java線程死鎖代碼示例
死鎖是操作系統(tǒng)層面的一個(gè)錯(cuò)誤,是進(jìn)程死鎖的簡稱,最早在 1965 年由 Dijkstra 在研究銀行家算法時(shí)提出的,它是計(jì)算機(jī)操作系統(tǒng)乃至整個(gè)并發(fā)程序設(shè)計(jì)領(lǐng)域最難處理的問題之一。
事實(shí)上,計(jì)算機(jī)世界有很多事情需要多線程方式去解決,因?yàn)檫@樣才能最大程度上利用資源,才能體現(xiàn)出計(jì)算的高效。但是,實(shí)際上來說,計(jì)算機(jī)系統(tǒng)中有很多一次只能由一個(gè)進(jìn)程使用的資源的情況,例如打印機(jī),同時(shí)只能有一個(gè)進(jìn)程控制它。在多通道程序設(shè)計(jì)環(huán)境中,若干進(jìn)程往往要共享這類資源,而且一個(gè)進(jìn)程所需要的資源還很有可能不止一個(gè)。因此,就會(huì)出現(xiàn)若干進(jìn)程競爭有限資源,又推進(jìn)順序不當(dāng),從而構(gòu)成無限期循環(huán)等待的局面。我們稱這種狀態(tài)為死鎖。簡單一點(diǎn)描述,死鎖是指多個(gè)進(jìn)程循環(huán)等待它方占有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那么死鎖涉及到的各個(gè)進(jìn)程都將永遠(yuǎn)處于封鎖狀態(tài)。
文件名:DeadThreadByExtend.java
注:
1、起線程的時(shí)候用的是start方法,run方法也可以調(diào)用,但是僅僅相當(dāng)于普通調(diào)用,在當(dāng)前線程內(nèi)執(zhí)行。
2、synchronized 不能直接修飾變量。
3、synchronized 塊并不會(huì)強(qiáng)制塊內(nèi)變量的單線程訪問。僅僅意味著在執(zhí)行塊內(nèi)語句時(shí)鎖住synchronized (args)的參數(shù),直到執(zhí)行結(jié)束才釋放。
package com.ycf.study.thread; class Sources{ int a; public void setA(int x) { synchronized (this) { this.a = x; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class DeadThreadByExtend { public static void main(String[] args) { Sources s1 = new Sources(); Sources s2 = new Sources(); class MyThread1 extends java.lang.Thread { @Override public void run() { System.out.println("線程1開始"); synchronized (s1) { System.out.println("線程1申請修改s1"); s1.setA(20); System.out.println("線程1修改完成"); System.out.println("線程1申請修改s2"); s2.setA(10); System.out.println("線程1修改s2完成"); } System.out.println("線程1退出并釋放鎖++++++++++"); } } class MyThread2 extends java.lang.Thread { @Override public void run() { System.out.println("線程2開始"); synchronized (s2) { System.out.println("線程2申請修改s2"); s2.setA(20); System.out.println("線程2修改s2完成"); System.out.println("線程2申請修改s1"); s1.setA(10); System.out.println("線程2修改s1完成"); } System.out.println("線程2退出并釋放鎖++++++++++"); } } MyThread1 mt1 = new MyThread1(); MyThread2 mt2 = new MyThread2(); mt1.start(); mt2.start(); } }
總結(jié)
以上就是本文關(guān)于java線程死鎖代碼示例的全部內(nèi)容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持。
相關(guān)文章
Java對敏感數(shù)據(jù)進(jìn)行加密的方法詳解
敏感數(shù)據(jù)的加密是數(shù)據(jù)安全的重要方面,尤其是對于手機(jī)號(hào)和身份證號(hào)這類個(gè)人信息,本文主要為大家介紹了Java對敏感數(shù)據(jù)進(jìn)行加密的相關(guān)方法,希望對大家有所幫助2024-03-03Idea 搭建Spring源碼環(huán)境的超詳細(xì)教程
這篇文章主要介紹了Idea 搭建Spring源碼環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Java代理模式之靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別及優(yōu)缺點(diǎn)
代理模式是一種常用的設(shè)計(jì)模式,它允許通過引入一個(gè)代理對象來控制對目標(biāo)對象的訪問,在Java中,代理模式被廣泛應(yīng)用,它可以提供額外的功能,如權(quán)限檢查、緩存、日志記錄等,本文將介紹靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別及優(yōu)缺點(diǎn),需要的朋友可以參考下2023-06-06java selenium教程環(huán)境搭建基于Maven
本文主要介紹Java selenium 環(huán)境的安裝,這里介紹了基于Maven的環(huán)境搭建,有需要的小伙伴可以參考下2016-08-08SpringBoot配置SwaggerUI訪問404錯(cuò)誤的解決方法
這篇文章主要為大家詳細(xì)介紹了SpringBoot配置SwaggerUI訪問404錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Spring aop+反射實(shí)現(xiàn)電話號(hào)加密
線上項(xiàng)目涉及大量查詢接口中,存在電話號(hào)明文展示不合規(guī)的問題。如果對每個(gè)接口返回結(jié)果中電話號(hào)相關(guān)字段修改相關(guān)代碼邏輯,則工作量較大花費(fèi)時(shí)間多。因此設(shè)計(jì)電話號(hào)加密注解,減少工作量。2021-06-06解決SpringMVC接收不到ajaxPOST參數(shù)的問題
今天小編就為大家分享一篇解決SpringMVC接收不到ajaxPOST參數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08