java死鎖和避免死鎖

概念:兩個或多個線程一直在相互等待其他線程完成而使得所有線程都始終處在阻塞的狀態

死鎖產生的四個必要條件

    1>資源互斥使用性,即當資源被一個線程使用(佔有)時,別的線程不能使用

    2>資源的不可搶佔,資源請求者不能強制從資源佔有者手中奪取資源,資源只能由資源佔有者主動釋放。

    3>執行者請求和保持,即當資源請求者在請求其他的資源的同時保持對原有資源的佔用。

    4>執行者循環等待,即存在一個等待隊列:P1佔有P2的資源,P2佔有P3的資源,P3佔有P1的資源。這樣就形成了一個等待環路。

查看死鎖:

1>使用JDK給我們的的工具JConsole,可以通過打開cmd然後輸入jconsole打開。

2>直接使用JVM自帶的命令

1)首先通過 jps 命令查看需要查看的Java進程的vmid

2)然後利用 jstack 查看該進程中的堆棧情況,在cmd中輸入 jstack -l 7412。

避免死鎖:

解決方式: 

1)java.util.concurrent.locks.Lock

ReentrantLock

ReentrantReadWriteLock

儘量使用tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock), 設置超時時間,超時可以退出防止死鎖。 

2)儘量使用java.util.concurrent(jdk 1.5以上)包的併發類代替手寫控制併發,

    比較常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,實際應用中java.util.concurrent.atomic十分有用,簡單方便且效率比使用Lock更高 

3)儘量降低鎖的使用粒度,儘量不要幾個功能用同一把鎖,能鎖塊不鎖方

4)儘量減少同步的代碼塊,synchronized

5)檢查線程的執行順序,避免資源競爭

    目前,Java語言已經廣泛應用於生活中的各個領域,無論是網絡編程還是數據庫編程,甚至是web開發都有Java語言的身影。很多小夥伴都喜歡在網上尋找教程,但遺憾的是很多小夥伴看完教程後都一頭霧水,即便是學會了也是一知半解,如果你真的想學習JAVA 推薦你一個羣【521595826】,只要你有一顆想學習的心就肯定能學會,不是想學習的就不要加了,不然也只是在浪費時間。

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章