併發(二)--------------死鎖
併發處理中通常需要解決的兩個問題:死鎖和飢餓
產生死鎖的原因主要是
- 系統資源不足。
- 程序執行推進的順序不合適。
- 資源分配不當等。
死鎖的條件
死鎖有三個必要條件:
·1.互斥。一次只有一個程序可以使用一個資源。
2.·佔有且等待。當一個程序等待其他程序時,繼續佔有已經分配的資源。
·3.不可搶佔。不能強行搶佔程序已佔有的資源。
前三個條件都只是死鎖存在的必要條件,但不是充分條件。對死鎖的產生,還需要第四個條件:
·4.迴圈等待。存在一個封閉的程序鏈,使得每個程序至少佔有此鏈中下一個程序所需要的一個資源。
死鎖的處理方法
- 死鎖預防
破壞死鎖的四個必要條件中的一個或多個來預防死鎖。
- 死鎖檢測與死鎖恢復
不試圖阻止死鎖,而是當檢測到死鎖發生時,採取措施進行恢復。
(一)每種型別一個資源的死鎖檢測 (二)每種型別多個資源的死鎖檢測 (三)死鎖恢復
利用搶佔恢復
利用回滾恢復
通過殺死程序恢復
- 死鎖避免
- 銀行家演算法:(Banker’s Algorithm)是一個避免死鎖(Deadlock)的著名演算法,是由艾茲格·迪傑斯特拉在1965年為T.H.E系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。
相關推薦
併發(二)--------------死鎖
併發處理中通常需要解決的兩個問題:死鎖和飢餓 產生死鎖的原因主要是 系統資源不足。 程序執行推進的順序不合適。 資源分配不當等。 死鎖的條件 死鎖有三個必要條件: ·1.互斥。一次只有一個程序可以使用一個資源。 2.·佔有且等待。當一個程序等待其他程序時,
死磕 java同步系列之ReentrantLock原始碼解析(二)——條件鎖
問題 (1)條件鎖是什麼? (2)條件鎖適用於什麼場景? (3)條件鎖的await()是在其它執行緒signal()的時候喚醒的嗎? 簡介 條件鎖,是指在獲取鎖之後發現當前業務場景自己無法處理,而需要等待某個條件的出現才可以繼續處理時使用的一種鎖。 比如,在阻塞佇列中,當佇列中沒有元素的時候是無法彈出一個元素
Java併發程式設計實戰(4)- 死鎖
在這篇文章中,我們主要討論一下死鎖及其解決辦法。 [toc] # 概述 在上一篇文章中,我們討論瞭如何使用一個互斥鎖去保護多個資源,以銀行賬戶轉賬為例,當時給出的解決方法是基於Class物件建立互斥鎖。 這樣雖然解決了同步的問題,但是能在現實中使用嗎?答案是不可以,尤其是在高併發的情況下,原因是我們使用
Java並發編程(十)死鎖
相同 左面 總結 read ++ 毫秒 共享 方法 IV 哲學家進餐問題 並發執行帶來的最棘手的問題莫過於死鎖了,死鎖問題中最經典的案例就是哲學家進餐問題:5個哲學家坐在一個桌子上,桌子上有5根筷子,每個哲學家的左手邊和右手邊各有一根筷子。示意圖如下: 哲學家進餐問題 並發
Java 8 與併發(二)
一、並行流與並行排序 Java 8中可以在介面不變的情況下,將流改為並行流,方便在多執行緒中進行集合中的資料處理。 1.1 使用並行流過濾資料 下面示例統計1~1000000內所有質數的數量。下面是一個判斷質數的函式: public class PrimeUtil {
深入Mysql鎖機制(二)讀鎖和寫鎖
深入Mysql鎖機制(二)讀鎖和寫鎖 這篇文章主要來介紹一下MySQL資料庫中的表級鎖。 本文提到的讀鎖和寫鎖都是MySQL資料庫的MyISAM引擎支援的表鎖的。而對於行級鎖的共享讀鎖和互斥寫鎖請閱讀MySQL中的共享鎖與排他鎖。我習慣在描述表鎖的時候按照讀寫來區分,在表
作業系統-程序(7)死鎖和銀行家演算法
允許多個程序併發執行共享系統資源時,系統必須提供同步機制和程序通訊機制。然而,對這種機制使用不當的話,可能會出現程序永遠被阻塞的現象。例如,兩個程序分別等待對方佔有的一個資源,於是兩者都不能執行而處於永遠等待,這種現象稱為死鎖。 死鎖產生的四個必要條件: 互斥條件: 程序應互斥使用資源,任一時刻一個資源僅
聊聊高併發(二)結合例項說說執行緒封閉和背後的設計思想
高併發問題拋去架構層面的問題,落實到程式碼層面就是多執行緒的問題。多執行緒的問題主要是執行緒安全的問題(其他還有活躍性問題,效能問題等)。 那什麼是執行緒安全?下面這個定義來自《Java併發程式設計實戰》,這本書強烈推薦,是幾個Java語言的作者合寫的,都是併發程式設計方面
聊聊併發(二)Java SE1.6中的Synchronized
1 引言 在多執行緒併發程式設計中Synchronized一直是元老級角色,很多人都會稱呼它為重量級鎖,但是隨著Java SE1.6對Synchronized進行了各種優化之後,有些情況下它並不那麼重了,本文詳細介紹了Java SE1.6中為了減少獲得鎖和釋放鎖帶來的效能消耗而引入的偏向鎖和
Java多執行緒與併發(二)
Synchronized執行緒同步機制 很多執行緒同時對同一個資料或者檔案進行訪問的時候,對於這個檔案如果進行併發讀寫可能會產生問題。 多執行緒機制來保證同一個時間,只有一個執行緒對這個資源進行讀寫,來保證多執行緒環境下是健壯的。 程式碼案例:
學習筆記(九)併發(二)
《Java程式設計思想》整理的一些學習筆記,有不對的地方,歡迎指出。 1.控制執行緒行為的方法——讓步:如果知道run()方法已經完成了所需的工作,可以給執行緒排程機制一個暗示:你的工作已經做的差不多了,可以讓別的執行緒使用CPU了,可以通過呼叫yield(
java多執行緒-專題-聊聊併發(二)Java SE1.6中的Synchronized
1 引言 在多執行緒併發程式設計中Synchronized一直是元老級角色,很多人都會稱呼它為重量級鎖,但是隨著Java SE1.6對Synchronized進行了各種優化之後,有些情況下它並不那麼重了,本文詳細介紹了Java SE1.6中為了減少獲得鎖和釋放鎖帶來的效
JAVA高併發(二)------區分執行緒和程序
執行緒與程序 程序是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎,在早期面向程序設計的計算機結構中,程序是程式的基本執行實體,在當代面向執行緒的計算機結構中,程序是執行緒的容器,程式是指令資料及其組織形式的描述,程序
多執行緒同步理解(二)——lock鎖方式
上篇文章,已經提了同步鎖的synchronized的物件鎖和類鎖。這一節我決定研究lock鎖的實現方式。lock鎖可以做到執行緒同步,也就是在多執行緒裡面實現加鎖,同步。 一、同一個物件同步鎖的區域性lock。 為同一個物件呼叫同一個方法的時候
設計模式(一):單例模式 JVM類載入機制 JDK原始碼學習筆記——Enum列舉使用及原理 Java併發(七):雙重檢驗鎖定DCL Java併發(二):Java記憶體模型 Java併發(二):Java記憶體模型 Java併發(七):雙重檢驗鎖定DCL JDK原始碼學習筆記——Enum列舉使用及原理
單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。 單例模式一般體現在類宣告中,單例的類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 適用場合: 需要頻繁的進行建立和銷燬的物件; 建立物
併發(二)
併發對於程式來講,並不安全。 多個執行緒同時對一個共享資源進行讀寫時,可能會發生錯誤。 如何避免這樣的問題? 1.synchronized關鍵字 被synchronized關鍵字修飾的域,將被“上鎖”,在程式執行這段程式碼時,只能有一個執行緒執行這段任務,在該執行緒沒有執行完成之前,其他執行緒將等待該
Java執行緒和多執行緒(九)——死鎖
Java中的死鎖指的就是一種多於兩個執行緒永遠阻塞的特殊狀況。Java中的死鎖狀態至少需要多於兩個執行緒以及資源的時候才會產生。這裡,我寫了一個產生死鎖的程式,並且講下如何分析死鎖。 首先來看一下產生死鎖的程式: package com.sapphire
zthread學習 例項十 執行緒間的協助(三)——死鎖
因為執行緒可以變為阻塞,且因為物件可以擁有互斥鎖,這些鎖能夠阻止執行緒在鎖被釋放之前訪問這個物件。所以就有可能出現這種情況,某個執行緒在等待另一個執行緒而第2個執行緒又在等待別的執行緒,以此類推,直到這個鏈上的最後一個執行緒回頭等待第1個執行緒。這樣就會得到一個由互相等待的
Java併發(三)ConcurrentHashMap鎖分段機制
Java 5.0 在 java.util.concurrent 包中提供了多種併發容器類來改進同步容器 的效能。 ConcurrentHashMap 同步容器類是Java 5 增加的一個執行緒安全的
JAVA多執行緒-Lock的使用(二)-公平鎖與非公平鎖
公平鎖與非公平鎖 鎖Lock分為:公平鎖和非公平鎖。 公平鎖:表示執行緒獲取鎖的順序是按照執行緒加鎖的順序來分配的,即先來先得的FIFO先進先出順序。 非公平