Java 鎖
什麼是執行緒安全?
當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件就是執行緒安全的。程式碼本省封裝了所有必要的正確性保障手段(互斥同步等),令呼叫者無需關心多執行緒的問題,更無需自己實現任何措施來保證多執行緒的正確呼叫。
如何來實現執行緒安全?
我們應用最多的就是互斥鎖;
java的互斥鎖的主要有synchronized,和JUC 中的lock兩種;
加鎖的原理是
物件上有一個是否加鎖的標誌位和鎖計數器,一個執行緒訪問了一個鎖住的程式碼後,獲取鎖,這時候會修改加鎖標誌位為“已加鎖”,鎖計數器=1;同一個執行緒訪問多個synchronized程式碼是不需要重複獲取鎖的,也就是說同一個執行緒是不會出現死鎖的問題。只是 鎖計數器 = 鎖計數器+1;當鎖計數器=0時,會釋放該物件的鎖。如果synchronized修飾的是一個靜態方法或class,這種情況是類鎖。而區別於前面的物件鎖了。
synchronized 主要用來修飾方法,或程式碼塊,在{}中的程式碼是需要獲取鎖以後才能訪問的,
synchronized的加鎖和鎖的釋放是有jvm管理的,不需要我們程式碼控制。
ReentrantLock的高階特性有那幾個?
1、等待可中斷,當持有鎖的執行緒長期不釋放的時候,正在等待的執行緒可以選擇放棄等待,改為處理其他事情;
2、可以實現公平鎖,公平鎖指多個執行緒在等待同一個鎖時,必須按照申請鎖的順序依次獲得鎖,synchronized是非公平鎖,ReentrantLock預設也是非公平的,只不過可以透過建構函式來制定實現公平鎖;
3、鎖繫結多個條件,ReentrantLock物件可以同時繫結多個Condition物件,在synchronized中,鎖物件的wait/notify/notifyall方法可以實現一個隱含的條件,如果要多一個條件關聯的時候,就需要額外的增加一個鎖;
關於鎖的幾個使用建議?
1、使用併發包中的類,併發包中的類大多數採用了lock-free等演算法,減少了多執行緒情況下的資源的鎖競爭,因此對於執行緒間的共享操作的資源而言,應儘量使用併發包中的類來實現;
2、儘可能少用鎖,沒必要用鎖的地方就不要用了;
3、拆分鎖,即把獨佔鎖拆分為多把鎖(這個不一定完全適用);
當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件就是執行緒安全的。程式碼本省封裝了所有必要的正確性保障手段(互斥同步等),令呼叫者無需關心多執行緒的問題,更無需自己實現任何措施來保證多執行緒的正確呼叫。
如何來實現執行緒安全?
我們應用最多的就是互斥鎖;
java的互斥鎖的主要有synchronized,和JUC 中的lock兩種;
加鎖的原理是
物件上有一個是否加鎖的標誌位和鎖計數器,一個執行緒訪問了一個鎖住的程式碼後,獲取鎖,這時候會修改加鎖標誌位為“已加鎖”,鎖計數器=1;同一個執行緒訪問多個synchronized程式碼是不需要重複獲取鎖的,也就是說同一個執行緒是不會出現死鎖的問題。只是 鎖計數器 = 鎖計數器+1;當鎖計數器=0時,會釋放該物件的鎖。如果synchronized修飾的是一個靜態方法或class,這種情況是類鎖。而區別於前面的物件鎖了。
synchronized 主要用來修飾方法,或程式碼塊,在{}中的程式碼是需要獲取鎖以後才能訪問的,
synchronized的加鎖和鎖的釋放是有jvm管理的,不需要我們程式碼控制。
ReentrantLock的高階特性有那幾個?
1、等待可中斷,當持有鎖的執行緒長期不釋放的時候,正在等待的執行緒可以選擇放棄等待,改為處理其他事情;
2、可以實現公平鎖,公平鎖指多個執行緒在等待同一個鎖時,必須按照申請鎖的順序依次獲得鎖,synchronized是非公平鎖,ReentrantLock預設也是非公平的,只不過可以透過建構函式來制定實現公平鎖;
3、鎖繫結多個條件,ReentrantLock物件可以同時繫結多個Condition物件,在synchronized中,鎖物件的wait/notify/notifyall方法可以實現一個隱含的條件,如果要多一個條件關聯的時候,就需要額外的增加一個鎖;
關於鎖的幾個使用建議?
1、使用併發包中的類,併發包中的類大多數採用了lock-free等演算法,減少了多執行緒情況下的資源的鎖競爭,因此對於執行緒間的共享操作的資源而言,應儘量使用併發包中的類來實現;
2、儘可能少用鎖,沒必要用鎖的地方就不要用了;
3、拆分鎖,即把獨佔鎖拆分為多把鎖(這個不一定完全適用);
相關文章
- Java鎖——死鎖Java
- Java鎖?分散式鎖?樂觀鎖?行鎖?Java分散式
- java重入鎖、公平鎖和非公平鎖Java
- [java][鎖]java鎖的膨脹和優化Java優化
- JAVA閉鎖Java
- java 中的鎖 -- 偏向鎖、輕量級鎖、自旋鎖、重量級鎖Java
- Java使用讀寫鎖替代同步鎖Java
- Java顯式鎖Java
- Java 中的鎖Java
- Java鎖詳解Java
- java 同步鎖(synchronized)Javasynchronized
- java鎖機制Java
- Java鎖最全詳解:樂觀鎖/悲觀鎖+公平鎖/非公平鎖+獨享鎖/共享鎖Java
- 淺談Java中的鎖:Synchronized、重入鎖、讀寫鎖Javasynchronized
- Java中的鎖之樂觀鎖與悲觀鎖Java
- Java中的樂觀鎖——無鎖策略Java
- java-樂觀鎖與悲觀鎖Java
- java 執行緒鎖物件鎖的理解Java執行緒物件
- Java併發-顯式鎖篇【可重入鎖+讀寫鎖】Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等...Java
- Java 中15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等等Java
- 扯扯Java中的鎖Java
- Java 中的死鎖Java
- Java併發4:鎖Java
- Java偏向鎖淺析Java
- Java中常見死鎖與活鎖的例項Java
- Java彌散系列 - 樂觀鎖與悲觀鎖Java
- 你用對鎖了嗎?淺談 Java “鎖” 事Java
- 例項詳解 Java 死鎖與破解死鎖Java
- Java多執行緒 -- 公平鎖和非公平鎖Java執行緒
- Java讀寫鎖ReadWriteLockJava
- java如何避免程式死鎖Java
- Java併發:樂觀鎖Java
- Java鎖之ReentrantLock(一)JavaReentrantLock
- Java鎖之ReentrantLock(二)JavaReentrantLock
- Java中的ReentrantLock鎖JavaReentrantLock
- Java 細粒度鎖續篇Java