1. 程式人生 > >Java中的鎖(1):同步、非同步、互斥、死鎖

Java中的鎖(1):同步、非同步、互斥、死鎖

主線:互斥鎖 ---> 死鎖 ---> 樂觀鎖與悲觀鎖 ---> 資料庫中的鎖(併發插入如何避免重複插入)

一、執行緒同步、非同步、互斥

1、執行緒同步:

         是指多個執行緒通過特定的設定(如互斥量、事件物件、臨界區)來控制執行緒之間的執行順序。這裡的同步不是同時進行。
   也就是說,執行緒之間通過同步建立起執行順序的關係,如果沒有同步,那執行緒之間是各自執行各自的!
   
       進一步的說明:就是前一個程序的輸出作為後一個程序的輸入,當第一個程序沒有輸出時第二個程序必須等待。具有同步關係的一組併發程序相互發送的資訊稱為訊息或事件。
       其中併發又有偽併發和真併發,偽併發是指單核處理器的併發,真併發是指多核處理器的併發。

2、執行緒非同步:

       非同步和同步是相對的,同步就是順序執行,執行完一個再執行下一個,需要等待、協調執行。非同步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成後再工作。
       執行緒就是實現非同步的一個方式。非同步是讓呼叫方法的主執行緒不需要同步等待另一執行緒的完成,從而可以讓主執行緒幹其它的事情。非同步和多執行緒並不是一個同等關係,非同步是最終目的,
       多執行緒只是我們實現非同步的一種手段。非同步是當一個呼叫請求傳送給被呼叫者,而呼叫者不用等待其結果的返回而可以做其它的事情。實現非同步可以採用多執行緒技術或則交給另外的程序來處理。
   
3、執行緒互斥:

      是指對於共享的程序系統資源,在各單個執行緒訪問時的排它性。當有若干個執行緒都要使用某一共享資源時,任何時刻最多隻允許一個執行緒去使用,其它要使用該資源的執行緒必須等待,直到佔用資源者釋放該資源。
       執行緒互斥可以看成是一種特殊的執行緒同步。
   
4、多執行緒的三個特性:
       原子性、可見性、有序性

5、如何保證執行緒同步?

java筆記--關於執行緒同步(7種同步方式): https://www.cnblogs.com/XHJT/p/3897440.html   
<MFC筆記> 四種執行緒同步(或互斥)方式小結:https://blog.csdn.net/ebowtang/article/details/29905309


二、死鎖

1、定義

         兩個或兩個以上的執行緒均持有對方不會釋放的資源,在相互請求這些不釋放的資源而處於一種永久的等待狀態。
  一句話描述:多個併發執行緒因爭奪(互斥)資源而產生相互等待的現象。

2、典型的兩種死鎖的情形:

(1)執行緒自己鎖住自己:
       一般情況下,如果一個執行緒先後呼叫兩次lock(),由於鎖已經被佔用,該執行緒會一直掛起等待佔有鎖的執行緒釋放鎖,然而鎖正是被自己佔用,該執行緒又被掛起而沒機會釋放鎖。因此,就永遠處於掛起狀態了,於是就形成了死鎖。
(2)多執行緒搶奪資源被困
       執行緒1鎖住了A,接著嘗試對B進行加鎖,同時執行緒2已經鎖住了B,又嘗試著對A加鎖。為了得到彼此的資源A和B,執行緒1和執行緒2將永遠的阻塞下去,這樣就發生了死鎖。
   
3、死鎖的產生四個必要條件:

   互斥條件:資源不能被共享,具有排它性,即一個資源只能被一個執行緒佔用,直到被改執行緒釋放。
   請求與保持條件:一個程序因請求被佔用資源而發生阻塞時,對已獲得的資源保持不放。
   非剝奪條件:任何一個資源在沒被該程序釋放之前,任何其他程序都無法對他剝奪佔用。
   迴圈等待條件:系統中若干程序組成環路,該環路中每個程序都在等待相鄰程序正佔用的資源。
   
4、引起死鎖的原因、如何避免死鎖?

https://blog.csdn.net/yangqiang387393/article/details/52155259


參考:
https://blog.csdn.net/ebowtang/article/details/29905309
https://blog.csdn.net/cqkxboy168/article/details/9026205/
https://blog.csdn.net/ebowtang/article/details/29905309