摘要:線程通過的方法獲得鎖,用方法釋放鎖。和關鍵字的區別在等待鎖時可以使用方法選擇中斷,改為處理其他事情,而關鍵字,線程需要一直等待下去。擁有方便的方法用于獲取正在等待鎖的線程。
ReentrantLock是Java并發包中一個非常有用的組件,一些并發集合類也是用ReentrantLock實現,包括ConcurrentHashMap。ReentrantLock具有三個特性:等待可中斷、可實現公平鎖、以及鎖可以綁定多個條件。
Java中的ReentrantLockReentrantLock與synchronized關鍵字一樣,屬于互斥鎖,synchronized中的鎖是非公平的(公平鎖是指多個線程等待同一個鎖時,必須按照申請鎖的時間順序來依次獲得鎖),ReentrantLock默認情況下也是非公平的,但可以通過帶布爾值的構造函數要求使用公平鎖。線程通過ReentrantLock的lock()方法獲得鎖,用unlock()方法釋放鎖。
ReentrantLock和synchronized關鍵字的區別ReentrantLock在等待鎖時可以使用lockInterruptibly()方法選擇中斷, 改為處理其他事情,而synchronized關鍵字,線程需要一直等待下去。同樣的,tryLock()方法可以設置超時時間,用于在超時時間內一直獲取不到鎖時進行中斷。
ReentrantLock可以實現公平鎖,而synchronized的鎖是非公平的。
ReentrantLock擁有方便的方法用于獲取正在等待鎖的線程。
ReentrantLock可以同時綁定多個Condition對象,而synchronized中,鎖對象的wait()和notify()或notifyAll()方法可以實現一個隱含的條件,如果要和多于一個條件關聯時,只能再加一個額外的鎖,而ReentrantLock只需要多次調用newCondition方法即可。
性能比較在JDK1.6之前,ReentrantLock的性能要明顯優于synchronized,但是JDK1.6中加入了很多針對鎖的優化措施,synchronized和ReentrantLock的性能基本完全持平了。
ReentrantLock缺點ReentrantLock的主要缺點是方法需要置于try-finally塊中,另外,開發人員需要負責獲取和釋放鎖,而開發人員常常忘記在finally中釋放鎖。
ReentrantLock和synchronized示例import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.logging.Logger; /** * Java program to show, how to use ReentrantLock in Java. * Reentrant lock is an alternative way of locking * apart from implicit locking provided by synchronized keyword in Java. * * @author Javin Paul */ public class ReentrantLockHowto { private final ReentrantLock lock = new ReentrantLock(); private int count = 0; //Locking using Lock and ReentrantLock public int getCount() { lock.lock(); try { System.out.println(Thread.currentThread().getName() + " gets Count: " + count); return count++; } finally { lock.unlock(); } } //Implicit locking using synchronized keyword public synchronized int getCountTwo() { return count++; } public static void main(String args[]) { final ThreadTest counter = new ThreadTest(); Thread t1 = new Thread() { @Override public void run() { while (counter.getCount() < 6) { try { Thread.sleep(100); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }; Thread t2 = new Thread() { @Override public void run() { while (counter.getCount() < 6) { try { Thread.sleep(100); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }; t1.start(); t2.start(); } } Output: Thread-0 gets Count: 0 Thread-1 gets Count: 1 Thread-1 gets Count: 2 Thread-0 gets Count: 3 Thread-1 gets Count: 4 Thread-0 gets Count: 5 Thread-0 gets Count: 6 Thread-1 gets Count: 7
Read more: http://javarevisited.blogspot...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66044.html
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
閱讀 2506·2021-10-14 09:42
閱讀 1148·2021-09-22 15:09
閱讀 3552·2021-09-09 09:33
閱讀 3035·2021-09-07 09:59
閱讀 3648·2021-09-03 10:34
閱讀 3547·2021-07-26 22:01
閱讀 2829·2019-08-30 13:06
閱讀 1214·2019-08-30 10:48