摘要:使用工具監測死鎖進入的安裝目錄中的目錄,執行命令可以看出得到運行的線程的值為,再執行命令,查看結果
死鎖
Java 線程是死鎖是一個經典的多線程問題,因為不同的線程都在等待根本不可能被釋放的鎖,從而導致所有的任務都無法繼續完成
舉個例子DealThread.java
package dealThread.demo; public class DealThread implements Runnable{ public String username; public Object lock1 = new Object(); public Object lock2 = new Object(); public void setFlag(String username){ this.username = username; } @Override public void run(){ if(username.equals("a")){ synchronized (lock1){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock2){ System.out.println("lock1 -> lock2"); } } } if(username.equals("b")){ synchronized (lock2){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock1){ System.out.println("lock2 -> lock1"); } } } } }
Run.java
package dealThread.demo; public class Run { public static void main(String[] args){ try{ DealThread t1 = new DealThread(); t1.setFlag("a"); Thread thread1 = new Thread(t1); thread1.start(); Thread.sleep(1000); t1.setFlag("b"); Thread thread2 = new Thread(t1); thread2.start(); }catch(InterruptedException e){ e.printStackTrace(); } } }
運行結果如下:
線程thread1和thread2都持有對方的鎖,而且需要等待對方釋放鎖之后才能往下繼續運行,這個時候就發生了死鎖;其實不使用嵌套的synchronized代碼結構也會出現死鎖,與嵌套不嵌套沒有任何關系,只要互相等待對方釋放鎖就有可能出現死鎖。
使用JDK工具監測死鎖進入JDK的安裝目錄中的bin目錄,執行jps命令:
可以看出得到運行的線程Run的id值為7404,再執行jstack命令,查看結果:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72026.html
摘要:因為多線程競爭鎖時會引起上下文切換。減少線程的使用。舉個例子如果說服務器的帶寬只有,某個資源的下載速度是,系統啟動個線程下載該資源并不會導致下載速度編程,所以在并發編程時,需要考慮這些資源的限制。 最近私下做一項目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Jav...
摘要:相比與其他操作系統包括其他類系統有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。因為多線程競爭鎖時會引起上下文切換。減少線程的使用。很多編程語言中都有協程。所以如何避免死鎖的產生,在我們使用并發編程時至關重要。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)syn...
摘要:上下文切換會影響到線程的執行速度,對于系統來說意味著會消耗大量的時間減少上下文切換的方式無鎖并發編程,在多線程競爭鎖時,會導致大量的上下文切換。線程在中的使用在中實現多線程的方式比較簡單,因為中提供了非常方便的來實現多線程。 文章簡介 上一篇文章我們了解了進程和線程的發展歷史、線程的生命周期、線程的優勢和使用場景,這一篇,我們從Java層面更進一步了解線程的使用 內容導航 并發編程的...
摘要:此時線程需要鎖才能繼續往下執行。但是線程的鎖并沒有釋放,線程的鎖也沒有釋放。 前言 只有光頭才能變強 回顧前面: ThreadLocal就是這么簡單 多線程三分鐘就可以入個門了! 多線程基礎必要知識點!看了學習多線程事半功倍 Java鎖機制了解一下 AQS簡簡單單過一遍 Lock鎖子類了解一下 線程池你真不來了解一下嗎? 本篇主要是講解死鎖,這是我在多線程的最后一篇了。主要將多線程...
閱讀 1228·2021-09-26 09:46
閱讀 1582·2021-09-06 15:00
閱讀 713·2019-08-30 15:52
閱讀 1116·2019-08-29 13:10
閱讀 1277·2019-08-26 13:47
閱讀 1479·2019-08-26 13:35
閱讀 2028·2019-08-23 18:38
閱讀 721·2019-08-23 17:59