鎖(java, DB)

鎖(java, DB)

什麼是鎖

對資源的訪問權限進行控制css

若是把一個資源(對象)比喻成屋子。就好像你進入了屋子鎖上了門。你家人和賊都進不去了。html

關鍵字:synchronized
介紹: 做爲在java中實現資源同步,「重量級」鎖。同步加鎖的是一個對象或者一個類,而不是代碼。
關鍵詞:volatile
介紹: 做爲Java中的輕量級鎖,當多線程中一個線程操做後能夠保證其餘線程可見,也就是書上所說的「可見性」,另一個就是「重排序」。
 關鍵詞:ReentrantLock(在JDK1.5中java.util.concurrent.*包,此包有一些併發操做的類庫)
介紹: ReentrantLock,這個鎖主要是能顯示的添加鎖和釋放鎖,好處是更加靈活,可以更加準確的控制鎖,也能確保系統的穩定,好比說「重連」。
關鍵詞:軟件包 java.util.concurrent.locks 
介紹:爲鎖和等待條件提供一個框架的接口和類,它不一樣於內置同步和監視器。
...
        

synchronized

一:Java鎖Synchronized,對象鎖和類鎖舉例:(com.kuyu.study.LockStudy)java

二:synchronized關鍵字可標記方法和代碼塊:(com.kuyu.study.LockStudy)mysql

  1. 實例方法和代碼塊
  2. 靜態方法和代碼塊

Java Synchronized,對象鎖和類鎖舉例:http://www.cnblogs.com/cangqiongbingchen/p/5806757.htmllinux

Java synchronized 介紹 :http://blog.csdn.net/suifeng3051/article/details/48711405sql

java synchronized關鍵字的用法:http://zhh9106.iteye.com/blog/2151791數據庫

死鎖

死鎖是兩個甚至多個線程被永久阻塞時的一種運行局面。死鎖的緣由:因爲兩個甚至多個線程相互等待對方已被鎖定的資源。多線程

死鎖發生的條件

 

  1. 互斥條件:線程對資源的訪問是排他性的,若是一個線程對佔用了某資源,那麼其餘線程必須處於等待狀態,直到資源被釋放。
  2. 請求和保持條件:線程T1至少已經保持了一個資源R1佔用,但又提出對另外一個資源R2請求,而此時,資源R2被其餘線程T2佔用,因而該線程T1也必須等待,但又對本身保持的資源R1不釋放。
  3. 不剝奪條件:線程已得到的資源,在未使用完以前,不能被其餘線程剝奪,只能在使用完之後由本身釋放。
  4. 環路等待條件:在死鎖發生時,必然存在一個「進程-資源環形鏈」,即:{p0,p1,p2,...pn},進程p0(或線程)等待p1佔用的資源,p1等待p2佔用的資源,pn等待p0佔用的資源。(最直觀的理解是,p0等待p1佔用的資源,而p1而在等待p0佔用的資源,因而兩個進程就相互等待)
圖解死鎖:

避免死鎖

  • 避免嵌套封鎖:這是死鎖最主要的緣由的,若是你已經有一個資源了就要避免封鎖另外一個資源。若是你運行時只有一個對象封鎖,那是幾乎不可能出現一個死鎖局面的。
  • 只對有請求的進行封鎖:你應當只想你要運行的資源獲取封鎖,好比在上述程序中我在封鎖的徹底的對象資源。可是若是咱們只對它所屬領域中的一個感興趣,那咱們應當封鎖住那個特殊的領域而並不是徹底的對象。
  • 避免無限期的等待:若是兩個線程正在等待對象結束,無限期的使用線程加入,若是你的線程必需要等待另外一個線程的結束,如果等待進程的結束加入最好準備最長時間。
Java死鎖範例以及如何分析死鎖:http://www.importnew.com/9668.html
JAVA實現的一個簡單的死鎖(附解釋):http://blog.csdn.net/zll793027848/article/details/8670546

活鎖、飢餓

活鎖是指線程1可使用資源,但它很禮貌,讓其餘線程先使用資源,線程2也可使用資源,但它很紳士,也讓其餘線程先使用資源。這樣你讓我,我讓你,最後兩個線程都沒法使用資源。併發

飢餓

飢餓:是指若是線程T1佔用了資源R,線程T2又請求封鎖R,因而T2等待。T3也請求資源R,當T1釋放了R上的封鎖後,系統首先批准了T3的請求,T2仍然等待。而後T4又請求封鎖R,當T3釋放了R上的封鎖以後,系統又批准了T4的請求......,T2可能永遠等待。框架

 

圖解活鎖:

圖解飢餓:

        

多線程-鎖locks

自 Java 5 開始,java.util.concurrent.locks 包中包含了一些鎖的實現,所以你不用去實現本身的鎖了。可是你仍然須要去了解怎樣使用這些鎖。

Java多線程-鎖:http://www.linuxidc.com/Linux/2016-09/134801.htm

Java多線程之併發鎖:http://www.linuxidc.com/Linux/2012-03/57069.htm

Java多線程之多線程的鎖機制:http://www.linuxidc.com/Linux/2016-07/133403.htm

Java多線程併發鎖和原子操做,你真的瞭解嗎?:http://blog.csdn.net/luohuacanyue/article/details/7796352

數據庫鎖

 

  1. 鎖的概念
  2. 鎖的分類
  3. 鎖的粒度

 

附:

mysql 鎖:http://blog.csdn.net/xifeijian/article/details/20313977

數據庫鎖:http://www.cnblogs.com/zhouqianhua/archive/2011/04/15/2017049.html

1:概念

數據庫是一個多用戶使用的共享資源。當多個用戶併發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的狀況。若對併發操做不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。 加鎖是實現數據庫併發控制的一個很是重要的技術。當事務在對某個數據對象進行操做前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了必定的控制,在該事務釋放鎖以前,其餘的事務不能對此數據對象進行更新操做。

2:分類

共享(S)鎖:多個事務可封鎖一個共享頁;任何事務都不能修改該頁; 一般是該頁被讀取完畢,S鎖當即被釋放。

排它(X)鎖:僅容許一個事務封鎖此頁;其餘任何事務必須等到X鎖被釋放才能對該頁進行訪問;X鎖一直到事務結束才能被釋放。

更新(U)鎖:更新鎖在修改操做的初始化階段用來鎖定可能要被修改的資源,這樣能夠避免使用共享鎖形成的死鎖現象。

由於使用共享鎖時,修改數據的操做分爲兩步,首先得到一個共享鎖,讀取數據,而後將共享鎖升級爲排它鎖,而後再執行修改操做。這樣若是同時有兩個或多個事務同時對一個事務申請了共享鎖,在修改數據的時候,這些事務都要將共享鎖升級爲排它鎖。這時,這些事務都不會釋放共享鎖而是一直等待對方釋放,這樣就形成了死鎖。若是一個數據在修改前直接申請更新鎖,在數據修改的時候再升級爲排它鎖,就能夠避免死鎖。

3:粒度

鎖定在較小的粒度的資源 --行 ,增大系統併發量,同時也增大系統開銷。維護鎖多

鎖定在較大的粒度的資源 --表 ,下降系統併發量,同時也下降系統開銷。維護鎖少

轉自http://res.kuyumall.com/document/java/html/lock.html

相關文章
相關標籤/搜索