java線程死鎖代碼示例
死鎖是操作系統(tǒng)層面的一個錯誤,是進程死鎖的簡稱,最早在 1965 年由 Dijkstra 在研究銀行家算法時提出的,它是計算機操作系統(tǒng)乃至整個并發(fā)程序設(shè)計領(lǐng)域最難處理的問題之一。
事實上,計算機世界有很多事情需要多線程方式去解決,因為這樣才能最大程度上利用資源,才能體現(xiàn)出計算的高效。但是,實際上來說,計算機系統(tǒng)中有很多一次只能由一個進程使用的資源的情況,例如打印機,同時只能有一個進程控制它。在多通道程序設(shè)計環(huán)境中,若干進程往往要共享這類資源,而且一個進程所需要的資源還很有可能不止一個。因此,就會出現(xiàn)若干進程競爭有限資源,又推進順序不當(dāng),從而構(gòu)成無限期循環(huán)等待的局面。我們稱這種狀態(tài)為死鎖。簡單一點描述,死鎖是指多個進程循環(huán)等待它方占有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那么死鎖涉及到的各個進程都將永遠處于封鎖狀態(tài)。
文件名:DeadThreadByExtend.java
注:
1、起線程的時候用的是start方法,run方法也可以調(diào)用,但是僅僅相當(dāng)于普通調(diào)用,在當(dāng)前線程內(nèi)執(zhí)行。
2、synchronized 不能直接修飾變量。
3、synchronized 塊并不會強制塊內(nèi)變量的單線程訪問。僅僅意味著在執(zhí)行塊內(nèi)語句時鎖住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)文章
詳解SpringCloud新一代網(wǎng)關(guān)Gateway
SpringCloud Gateway是Spring Cloud的一個全新項目,Spring 5.0+ Spring Boot 2.0和Project Reactor等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的API路由管理方式2021-06-06maven <repositories>標(biāo)簽和<pluginRepositories>標(biāo)簽的使用
這篇文章主要介紹了maven <repositories>標(biāo)簽和<pluginRepositories>標(biāo)簽的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringBoot Redis用注釋實現(xiàn)接口限流詳解
Redis 除了做緩存,還能干很多很多事情:分布式鎖、限流、處理請求接口冪等性。。。太多太多了~今天想和小伙伴們聊聊用 Redis 處理接口限流,這也是最近的 項目涉及到這個知識點了,我就拎出來和大家聊聊這個話題2022-07-07SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式
Spring Boot是一個用于構(gòu)建獨立的、可執(zhí)行的Spring應(yīng)用程序的框架,結(jié)合使用Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中本文,主要介紹了SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式,感興趣的可以了解一下2024-01-01