多线程学习(三)----死锁问题
多線程死鎖問題
前天俺們談到了加鎖,但是在使用加鎖的同時(shí)又會(huì)帶來一個(gè)問題,就是死鎖。
什么叫死鎖?
所謂死鎖: 是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。
????
那么為什么會(huì)產(chǎn)生死鎖呢?
1.因?yàn)橄到y(tǒng)資源不足。
2.進(jìn)程運(yùn)行推進(jìn)的順序不合適。????
3.資源分配不當(dāng)。
?????????????
學(xué)過操作系統(tǒng)的朋友都知道:產(chǎn)生死鎖的條件有四個(gè):
1.互斥條件:所謂互斥就是進(jìn)程在某一時(shí)間內(nèi)獨(dú)占資源。
2.請求與保持條件:一個(gè)進(jìn)程因請求資源而阻塞時(shí),對已獲得的資源保持不放。
3.不剝奪條件:進(jìn)程已獲得資源,在末使用完之前,不能強(qiáng)行剝奪。
4.循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
???
例如:?????
死鎖是因?yàn)槎嗑€程訪問共享資源,由于訪問的順序不當(dāng)所造成的,通常是一個(gè)線程鎖定了一個(gè)資源A,而又想去鎖定資源B;在另一個(gè)線程中,鎖定了資源B,而又想去鎖定資源A以完成自身的操作,兩個(gè)線程都想得到對方的資源,而不愿釋放自己的資源,造成兩個(gè)線程都在等待,而無法執(zhí)行的情況。
分析死鎖產(chǎn)生的原因不難看出是由訪問共享資源順序不當(dāng)所造成的,下面寫一個(gè)造成線程死鎖的例子,希望能對大家理解多線程死鎖問題有進(jìn)一步的理解!如果有人需要編寫多線程的系統(tǒng),當(dāng)操作共享資源時(shí)一定要特別的小心,以防出現(xiàn)死鎖的情況!
package com.ljq.test;public class RunnableTest implements Runnable {private int flag = 1;private Object obj1 = new Object(), obj2 = new Object();public void run() {System.out.println("flag=" + flag);if (flag == 1) {synchronized (obj1) {System.out.println("我已經(jīng)鎖定obj1,休息0.5秒后鎖定obj2去!"); try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj2) {System.out.println("1");}}}if (flag == 0) {synchronized (obj2) {System.out.println("我已經(jīng)鎖定obj2,休息0.5秒后鎖定obj1去!"); try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj1) {System.out.println("0");}}}}public static void main(String[] args) {RunnableTest run01 = new RunnableTest();RunnableTest run02 = new RunnableTest();run01.flag = 1;run02.flag = 0;Thread thread01 = new Thread(run01);Thread thread02 = new Thread(run02);System.out.println("線程開始嘍!"); thread01.start();thread02.start();} }?????????????
運(yùn)行結(jié)果如下:
??????????????
這樣就產(chǎn)生了死鎖,這是我們過多的使用同步而產(chǎn)生的。我們在java中使用synchonized的時(shí)候要考慮這個(gè)問題,如何解決死鎖,大家可以從死鎖的四個(gè)條件去解決,只要破壞了一個(gè)必要條件,那么我們的死鎖就解決了。在java中使用多線程的時(shí)候一定要考慮是否有死鎖的問題哦。
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的多线程学习(三)----死锁问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL学习之一(栈(statck))
- 下一篇: 多线程学习(二)----AfxBegin