1. 程式人生 > >多執行緒六:死鎖例子與排查

多執行緒六:死鎖例子與排查

死鎖產生情況:雙方互相持有對方的鎖的情況

死鎖示例程式碼:

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("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("lock1執行");
				}
			}
		}
	}
}

Run方法:
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(100);
			t1.setFlag("b");
			Thread thread2 = new Thread(t1);
			thread2.start();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

執行結果:

排查:

使用jdk自帶工具進行排查
執行jps指令,可以檢視當前執行的執行緒:

可以看到Run執行緒的id值為3684。在執行jstack命令,檢視結果:


相關推薦

執行例子排查

死鎖產生情況:雙方互相持有對方的鎖的情況死鎖示例程式碼:public class DealThread implements Runnable { public String username; p

Java執行7

前言 死鎖單獨寫一篇文章是因為這是一個很嚴重的、必須要引起重視的問題。這不是誇大死鎖的風險,儘管鎖被持有的時間通常很短,但是作為商業產品的應用程式每天可能要執行數十億次獲取鎖->釋放鎖的操作,只要在這數十億次操作中只要有一次發生了錯誤,就可能導致程式中發生死鎖,並且即使通過壓力測試也不可能找出所有潛在

執行()volatile

一:執行緒無法終止 public class MyThread extends Thread { private static boolean flag = true; @Override public void run() { System

【JAVA執行問題之

  一、死鎖是什麼? 舉個例子:兩個人一起吃飯,每個人都拿了一隻筷子,雙方都在等待對方將筷子讓給自己,結果兩個人都吃不了飯。這種情況和計算機中的死鎖情況很相似。 假設有兩個執行緒,互相等待對方釋放佔有的鎖,但是釋放鎖的條件又不可能形成,這時候死鎖就形成了。 還是買票的問題,有的時候時會發生死

gdb除錯執行出現的

   多執行緒的條件下,程式很容易出現死鎖,此時各個執行緒處於等待狀態,可以通過gdb除錯找到死鎖出現的地方。 例子: #include <stdio.h> #include <pthread.h> #include <uni

Java執行8synchronized重入

synchronized方法/塊的內部呼叫本類的其他synchronized方法/時,是可得到鎖的。 關鍵字synchronized擁有鎖重入的功能,也就是在使用synchronized時,當一個執行緒

執行dispatch_semaphore

一、定義 semaphore叫做”訊號量” 訊號量的初始值,可以用來控制執行緒併發訪問的最大數量 比如想要有3個執行緒同時執行任務,訊號量的初始值就寫3. 訊號量的初始值為1,代表同時只允許1條執行緒訪問資源,保證執行緒同步 程式碼: 例子: //

【面試系列】哲學家就餐問題(3個)--執行,防

public class Dinning { public static void main(String[] args) { KuaiZi k1 = new KuaiZi("筷子一號"); KuaiZi k2 = new KuaiZi("筷子二號"); Ku

python執行程式設計(4): 和可重入

線上程間共享多個資源的時候,如果兩個執行緒分別佔有一部分資源並且同時等待對方的資源,就會造成死鎖。儘管死鎖很少發生,但一旦發生就會造成應用的停止響應。下面看一個死鎖的例子: # encoding: UTF-8import threadingimport timec

談談C#執行開發並行、併發非同步程式設計

閱讀導航 一、使用Task 二、並行程式設計 三、執行緒同步 四、非同步程式設計模型 五、多執行緒資料安全 六、異常處理   概述 現代程式開發過程中不可避免會使用到多執行緒相關的技術,之所以要使用多執行緒,主要原因或目的大致有以下幾個: 1、 業務特性決定程式就是多工的,比如,一邊採集資料、一邊分

Java執行12執行

Java執行緒死鎖是一個經典的多執行緒問題,因為不同的執行緒都在等待根本不可能被釋放的鎖,從而導致所有的任務都無法繼續完成。在多執行緒技術中,“死鎖”是必須避免的,因為這會造成執行緒的“假死”。 pac

執行——加方案一 OSSpinLock

一、iOS 中的執行緒同步方案 -> 加鎖 OSSpinLock:自旋鎖 os_unfair_lock pthread_mutex dispatch_semaphore dispatch_queue(DISPATCH_QUEUE_SERIAL) NSL

執行(五) CAS無機制

java程式設計規範中long與double操作並不是原子的,在java的部分執行環境中,對於long以及double的操作並不是原子的。 例如有一個long型別的longfield欄位,某個執行緒正在執行:longfield = 123L ;這樣的指定操作,而同時有另一個執行緒正在

執行(四)

當我們修改多個執行緒共享的例項時,例項就會失去安全性,所以我們應該仔細找出例項狀態不穩定的範圍,將這個範圍設為臨界區,並對臨界區進行保護,使其只允許一個執行緒同時執行。Java使用synchronized或Lock來定義臨界區,保護多個執行緒共享的欄位。 例項的全域性變數(共享資源)

執行面試執行+執行池+執行同步等

1、併發程式設計三要素? 1)原子性 原子性指的是一個或者多個操作,要麼全部執行並且在執行的過程中不被其他操作打斷,要麼就全部都不執行。 2)可見性 可見性指多個執行緒操作一個共享變數時,其中一個執行緒對變數進行修改後,其他執行緒可以立即看到修改的結果。 實現可見性的方法

java執行3關鍵字synchronized取得的都是物件,而不是把一段程式碼或者方法(函式)當作

java多執行緒3:關鍵字synchronized取得的鎖都是物件鎖,而不是把一段程式碼或者方法(函式)當作鎖 a.當多個執行緒訪問同一個物件的時候,哪個執行緒先執行帶synchronized關鍵字的方法,哪個執行緒就該方法所屬物件的鎖Lock,那麼其他物件就智慧呈等待狀態。但是如果多個執行緒訪

Python3之執行GIL、同步、訊號量、遞迴執行Queue、Event、定時器

GIL與互斥鎖再理解 執行緒一要把python程式碼交給直譯器去執行,而此時垃圾回收執行緒和執行緒二也需要將自己的任務交給python直譯器去執行,為了防止各個執行緒之間的資料產生衝突,誰拿到GIL鎖的許可權誰才能執行自己的任務,這就避免了不同任務之間的資

執行 共享資源 同步 java Java執行程式設計Lock

Java多執行緒程式設計:Lock   synchronized是java中的一個關鍵字,也就是說是Java語言內建的特性。那麼為什麼會出現Lock呢?   如果一個程式碼塊被synchronized修飾了,當一個執行緒獲取了對應的鎖,並執行該程式碼塊時,其他執行緒便只

Java併發基礎04執行技術之問題

歡迎關注我的微信公眾號:程式設計師私房菜(id:eson_15) 我們知道,使用 synchronized 關鍵字可以有效的解決執行緒同步問題,但是如果不恰當的使用 synchronized 關鍵字的話也會出問題,即我們所說的死鎖。死鎖是這樣一種情形:多個執行緒同時被阻塞,它們中的一個或者全部都在等待某個資

Java線程7

選擇 進程id 監測 while 發生 問題 println 導致 -h http://www.cnblogs.com/xrq730/p/4853713.html 前言 死鎖單獨寫一篇文章是因為這是一個很嚴重的、必須要引起重視的問題。這不是誇大死鎖的風險,盡管鎖被持有的時間