Java 死鎖(DeadLock)例項分析和預防[base jdk8]
synchronized實現死鎖
/**
* Created by Administrator on 2018/2/3.
*/
public class SynchronizedDeadLockTest {
static Object src1 = new Object();
static Object src2 = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new DeadARunnable(), "t1");
Thread t2 = new Thread(new DeadBRunnable(), "t2");
t1.start();
t2.start();
}
}
class DeadARunnable implements Runnable {
@Override
public void run() {
synchronized (SynchronizedDeadLockTest.src1){
try{
System.out.println(Thread.currentThread().getName()+" get src1 ing!");
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+" after sleep 500ms!");
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" need src2 and waiting!");
/**
* Thread t2 try get source src2 when locked source src1
*/
synchronized (SynchronizedDeadLockTest.src2){
System.out.println(Thread.currentThread().getName()+" get src2 ing!");
}
}
}
}
class DeadBRunnable implements Runnable {
@Override
public void run() {
synchronized (SynchronizedDeadLockTest.src2){
try{
System.out.println(Thread.currentThread().getName()+" get src2 ing!");
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+" after sleep 500ms!");
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" need src1 and waiting!");
/**
* Thread t1 try get source src1 when locked source src2
*/
synchronized (SynchronizedDeadLockTest.src1){
System.out.println(Thread.currentThread().getName()+" get src1 ing!");
}
}
}
}
飢餓
指的執行緒無法訪問到它需要的資源而不能繼續執行的一種狀態。引發飢餓最常見資源就是CPU時鐘週期。雖然在Thread API中由指定執行緒優先順序的機制,但是隻能作為作業系統進行執行緒排程的一個參考,作業系統在進行執行緒排程是平臺無關的,會盡可能提供公平的、活躍性良好的排程,那麼即使在程式中指定了執行緒的優先順序,也有可能在作業系統進行排程的時候對映到了同一個優先順序。通常情況下,不要區修改執行緒的優先順序,一旦修改程式的行為就會與平臺相關,並且會導致飢餓問題的產生。在程式中使用的Thread.yield或者Thread.sleep表明該程式試圖客服優先順序調整問題,讓優先順序更低的執行緒擁有被CPU排程的機會。
活鎖
指的是執行緒不斷重複執行相同的操作,但每次操作的結果都是失敗的。儘管這個問題不會阻塞執行緒,但是程式也無法繼續執行。活鎖通常發生在處理事務訊息的應用程式中,如果不能成功處理這個事務那麼事務將回滾整個操作。解決活鎖的辦法是在每次重複執行的時候引入隨機機制,這樣由於出現的可能性不同使得程式可以繼續執行其他的任務。
相關文章
- 例項詳解 Java 死鎖與破解死鎖Java
- [Java]一個DeadLock(死鎖)的例子Java
- oracle deadlock死鎖trace file分析之一Oracle
- Java中常見死鎖與活鎖的例項Java
- 死鎖_DeadLock_示例
- 【DEADLOCK】Oracle“死鎖”模擬Oracle
- oracle deadlock死鎖trace file分析之一增補Oracle
- 剖析6個MySQL死鎖案例的原因以及死鎖預防策略MySql
- MySQL 行級鎖的使用以及死鎖的預防MySql
- 使用oracle 10704 event分析獲取鎖lock及死鎖deadlock系列九Oracle
- 基於10.2.0.1 rac deadlock死鎖 trace file分析_增補二
- RDSSQLServer死鎖(Deadlock)系列之三自動部署Profiler捕獲死鎖SQLServer
- 使用jstack檢測Java應用的死鎖(deadlock)狀態JSJava
- 死鎖-舉例
- Java鎖——死鎖Java
- 死鎖分析
- select for update語句造成ORA-00060 deadlock死鎖問題分析
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- 歸檔空間不足導致例項死鎖
- oracle lock轉換及oracle deadlock死鎖系列一Oracle
- 死鎖案例分析
- HashMap死鎖分析HashMap
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- MySQL:死鎖一例MySql
- 關於 SAP HANA 資料庫的死鎖問題(deadlock)資料庫
- 【死鎖】ORA-00060: deadlock detected while waiting for resourceWhileAI
- 測試庫死鎖診斷DEADLOCK DETECTED ( ORA-00060 )
- GreatSQL 死鎖案例分析SQL
- 舉例講解 Python 中的死鎖、可重入鎖和互斥鎖Python
- MySQL 死鎖和鎖等待MySql
- 故障分析 | MySQL死鎖案例分析MySql
- SQLServer的死鎖分析(1):頁鎖SQLServer
- Java 中的死鎖Java
- MySQL 死鎖問題分析MySql
- ORACLE 死鎖分析過程Oracle
- Sqlserver分析死鎖問題SQLServer
- 線上死鎖問題分析
- MySQL 死鎖日誌分析MySql