死鎖是操作系統層面的一個錯誤,是進程死鎖的簡稱,最早在1965 年由Dijkstra 在研究銀行家算法時提出的,它是計算機操作系統乃至整個並發程序設計領域最難處理的問題之一。
事實上,計算機世界有很多事情需要多線程方式去解決,因為這樣才能最大程度上利用資源,才能體現出計算的高效。但是,實際上來說,計算機系統中有很多一次只能由一個進程使用的資源的情況,例如打印機,同時只能有一個進程控制它。在多通道程序設計環境中,若干進程往往要共享這類資源,而且一個進程所需要的資源還很有可能不止一個。因此,就會出現若干進程競爭有限資源,又推進順序不當,從而構成無限期循環等待的局面。我們稱這種狀態為死鎖。簡單一點描述,死鎖是指多個進程循環等待它方佔有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個進程都將永遠處於封鎖狀態。
文件名:DeadThreadByExtend.java
注:
1、起線程的時候用的是start方法,run方法也可以調用,但是僅僅相當於普通調用,在當前線程內執行。
2、synchronized 不能直接修飾變量。
3、synchronized 塊並不會強制塊內變量的單線程訪問。僅僅意味著在執行塊內語句時鎖住synchronized (args)的參數,直到執行結束才釋放。
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();}}總結
以上就是本文關於java線程死鎖代碼示例的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持。