1. 程式人生 > >死鎖的三種形式:一般死鎖,巢狀管程鎖死,重入鎖死

死鎖的三種形式:一般死鎖,巢狀管程鎖死,重入鎖死

package com.cxt.Lock;

import com.cxt.thread.Synchronizer;
import com.cxt.thread.TestLock;

//lock implementation with nested monitor lockout problem
/**
 * 一個坑爹的巢狀管程鎖死,區別於死鎖
 */
public class Lock {
	protected MonitorObject monitorObject = new MonitorObject();
	protected boolean isLocked = false;

	public static void main(String[] args) {
		Lock l = new Lock();
		l.isLocked = true;

		MyRunnable r1 = new MyRunnable(l, 0);
		MyRunnable r2 = new MyRunnable(l, 0);
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r2);
		t1.start();
		t2.start();
		/*
		 * 時而鎖住,時而釋放,因為另外兩條執行緒沒有有時捕捉不到isLocked = false
		 */
//		for (int i = 0; i < 100; i++) {
//			l.isLocked = false;
//			try {
//				Thread.sleep(10);
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			}
//		}
		//

	}

	public void lock() throws InterruptedException {
		// 當執行這個方法時,isLocked=true時,其他方法無論執行lock方法還是執行Unlock方法都會導致管程死鎖
		// 只有手動將isLocked 設定為false才能解決死鎖,設定為false時必須讓其他執行緒檢測到,所以必須設定時間長一點
		synchronized (this) {
			while (isLocked) {
				synchronized (this.monitorObject) {
					this.monitorObject.wait();
				}
			}
			isLocked = true;
		}
	}

	public void unlock() {
		synchronized (this) {
			this.isLocked = false;
			synchronized (this.monitorObject) {
				this.monitorObject.notify();
			}
		}
	}

	static class MyRunnable implements Runnable {
		Lock l = null;
		int i;

		public MyRunnable(Lock l, int i) {
			this.l = l;
			this.i = i;
		}

		@Override
		public void run() {
			try {
				if (i % 2 == 0) {
					this.l.lock();
				} else {
					this.l.unlock();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}
}

我們觀察lock()方法,執行lock()時,當isLocked 為true時,問題就來了,執行monitorObject的方法塊,

相關推薦

形式一般鎖死鎖死

package com.cxt.Lock; import com.cxt.thread.Synchronizer; import com.cxt.thread.TestLock; //lock implementation with nested monitor lockout problem /**

Java基礎多執行緒之執行緒安全-同步形式

首先,我們通過一個案例,演示執行緒的安全問題: 電影院要賣票,我們模擬電影院的賣票過程。假設要播放的電影是 “葫蘆娃大戰奧特曼”,本次電影的座位共100個(本場電影只能賣100張票)。我們來模擬電影院的售票視窗,實現多個視窗同時賣 “終結者”這場電影票(多個視窗一起賣這100張票)需要視窗

動態規劃(2)動態規劃的形式

例:數字三角形(POJ 1163) Language:DefaultThe Triangle Time Limit: 1000MSMemory Limit: 10000KTotal Submissions: 45053Accepted: 27208Des

win10系統工作列卡怎麼辦(方式)

win10經過週年更新後,不少使用者碰到工作列卡死的現象,右擊工作列無任何反應,這多是由資源管理器執行異常、右鍵選單設定不當等因素導致的,下面就和大家分享win10工作列卡死的解決方法。  方法一、

winform防止介面卡方法

在程式設計過程中經常會遇到耗時操作,這個時候如果不採取一些必要的非同步操作,就會導致介面的卡死,這裡以winform為例子,介紹三種方法防止介面卡死,對這幾個方法稍加修改同樣適用於wpf,silverlight等程式 首先給出一個函式模擬耗時操作 1使用委託+QueueUs

go語言for的形式

go for 語法在Go中其他循環遍歷的控制語句,唯有for。而for同樣也是比較靈活的:package mainimport "fmt"func main() { // 最基本的一種,單一條件循環 // 這個可以代替其他語言的while循環 i := 1 for i <= 3

解梯度下降法的形式BGD、SGD以及MBGD

有一個 lis 一行 pri mbg 網絡 () 次數 pen 原帖地址:https://zhuanlan.zhihu.com/p/25765735           在應用機器學習算法時

Java排序冒泡選擇插入排序

反序 三種 blog void bubble public string length 選擇 三種排序:冒泡,選擇,插入排序 public static void bubbleSort(int[] source){ // 交換

QComboBox實現復選功能(方法嵌套QListWidget, 設置QStandardItemModel, 設置Delegate)

編輯 int() move bsp 下一個 tab url 進行 問題 今天介紹一下一個小東西 — 如何讓QComboBox實現復選功能? 需求: 下拉列表有復選功能 不可編輯 顯示所有選中項 關於QComboBox的復選功能有幾種

排序快排歸並堆排

new swap 簡單 數組合並 col 最大 heapsort 堆排序 大神 轉自:http://www.cnblogs.com/LUO77/p/5798149.html (一)快排 快排考的是最多次的。之前看大神寫的算法很簡單,思想也很好。就一直用他的思想去思考快排

new和delete的形式詳解

分別是 額外 ID 調用 pre else class code alloc 一、new操作符、delete操作符 class String { public: String(const char *str="") { if

日常學習隨筆-數組、單鏈表、雙鏈表形式實現棧結構的基本操作

ext return lse efi CA 需要 kde 當前 default 一、棧結構   棧(stack)是限制插入和刪除只能在一個位置上的表,該位置是 表的末端,叫做棧的頂(Top)。對棧的基本操作有push(進棧),pop(出棧),peak(棧頂元素),size(

梯度下降法的形式-BGD、SGD、MBGD

方法 ont -o 設置 求解 最小值 ima 求和 參數 在應用機器學習算法時,我們通常采用梯度下降法來對采用的算法進行訓練。其實,常用的梯度下降法還具體包含有三種不同的形式,它們也各自有著不同的優缺點。 下面我們以線性回歸算法來對三種梯度下降法進行比較。 一般線

python 類C數組的兩形式list -->內容可變, tuple --->內容不可變

size print app http append 列表 itl c數組 multi python 中的列表相當與 C 中的數組,列表:list 初始化使用[ ], 元組:tuple 初始化使用();一、列表list 1 #!/usr/bin/python 2 3

詳解ssh通過公鑰密碼、免密碼登錄以及導公鑰文件形式實現遠登錄

eve 模式 tables col symmetric trie ado grace 日誌 簡介 SSH(Secure Shell)是一種安全通道協議,主要用來實現字符界面的遠程登錄、遠程復制等功能,SSH協議對通信雙方的數據傳輸進行了加密處理,其中包括用戶登錄時輸入的用戶

1. 變數提升 2. 條件語句 3. 迴圈語句 彈出框的形式 If條件的種類

1.     變數提升 變數提升是瀏覽器的一個功能,在執行js程式碼之前,瀏覽器會給js一個全域性作用域叫window ,window分兩個模組,一個叫記憶體模組,一個叫執行模組,記憶體模組找到當前作用域下的所有帶var和function的關鍵字,執行模組執行js程

【Javascript】JS遍歷陣列的方法map、forEach、filter

前言   近一段時間,因為專案原因,會經常在前端對陣列進行遍歷、處理,JS自帶的遍歷方法有很多種,往往不加留意,就可能導致知識混亂的現象,並且其中還存在一些坑。前端時間在ediary中總結了js原生自帶的常用的對陣列遍歷處理的方法,分別為:map、forEach、filter,在講解知識點的同時,會類比相識

細談 C++ 返回傳值的方式按值返回、按常量引用返回以及按引用返回

一、引言 停滯了很久,最近又開始細細品味起《Data Structure And Algorithm Analysis In C++》這本書了。這本書的第一章即為非常好的 C++11 統領介紹的教材範文,可能對於 C++11 新手來說,作者這樣短篇幅的介紹或許有些蒼白晦澀,但是對於我

java斐波那契數列(Fibonacci sequence)的方式遞迴備忘錄動態規劃

java斐波那契數列(Fibonacci sequence)的三種方式:遞迴,備忘錄,動態規劃 1.最常使用的是遞迴,就是從上往下尋找答案,然後在返回來。 2.備忘錄也是從上往下,只是去掉了遞迴中重複計算的部分,因為它使用一個容器來裝已經計算出的值,這裡就多一個判斷,如果計算過該式子,就直接

梯度下降的形式

梯度下降法的三種形式BGD、SGD以及MBGD 轉自:https://zhuanlan.zhihu.com/p/25765735 在應用機器學習演算法時,我們通常採用梯度下降法來對採用的演算法進行訓練。其實,常用的梯度下降法還具體包含有三種不同的形式,它們也各自有著不同的優缺點。 下面我