死锁产生的原因及条件和手写死锁
生活随笔
收集整理的這篇文章主要介紹了
死锁产生的原因及条件和手写死锁
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
什么是死鎖?
由于兩個或者多個線程互相持有對方所需要的資源,導致線程處于等待狀態(tài),造成死鎖。
為什么會產(chǎn)生死鎖(為什么會互相占用對方的資源)
- 因為系統(tǒng)資源不足。
- 進程運行推進的順序不合適。
- 資源分配不當?shù)取?/span>
產(chǎn)生死鎖的四個必要條件
互斥條件:一個資源每次只能被一個進程使用。
請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
循環(huán)等待條件:若干進程之間形成一種頭尾相接的循環(huán)等待資源關系。
手寫死鎖
public class DeadLock {public static void main(String[] args) {Object object1 = new Object();Object object2 = new Object();Thread thread1 = new Thread(new FirstThread(object1, object2));Thread thread2 = new Thread(new SecondThread(object1, object2));thread1.start();thread2.start();} }class FirstThread implements Runnable {Object object1;Object object2;public FirstThread(Object object1, Object object2) {this.object1 = object1;this.object2 = object2;}@Overridepublic void run() {synchronized (object1) {// 獲得鎖對象1try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}synchronized (object2) {// 獲得鎖對象2 }}} }class SecondThread implements Runnable {Object object1;Object object2;public SecondThread(Object object1, Object object2) {this.object1 = object1;this.object2 = object2;}@Overridepublic void run() {synchronized (object2) {// 獲得鎖對象2try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}synchronized (object1) {// 獲得鎖對象1 }}} }?
轉(zhuǎn)載于:https://www.cnblogs.com/java-spring/p/10792062.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的死锁产生的原因及条件和手写死锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机画面的音乐素材,音效素材:高科技用
- 下一篇: oracle数据库课后报告,ORACLE