摘要:線程通過的方法獲得鎖,用方法釋放鎖。和關(guān)鍵字的區(qū)別在等待鎖時可以使用方法選擇中斷,改為處理其他事情,而關(guān)鍵字,線程需要一直等待下去。擁有方便的方法用于獲取正在等待鎖的線程。
ReentrantLock是Java并發(fā)包中一個非常有用的組件,一些并發(fā)集合類也是用ReentrantLock實現(xiàn),包括ConcurrentHashMap。ReentrantLock具有三個特性:等待可中斷、可實現(xiàn)公平鎖、以及鎖可以綁定多個條件。
Java中的ReentrantLockReentrantLock與synchronized關(guān)鍵字一樣,屬于互斥鎖,synchronized中的鎖是非公平的(公平鎖是指多個線程等待同一個鎖時,必須按照申請鎖的時間順序來依次獲得鎖),ReentrantLock默認情況下也是非公平的,但可以通過帶布爾值的構(gòu)造函數(shù)要求使用公平鎖。線程通過ReentrantLock的lock()方法獲得鎖,用unlock()方法釋放鎖。
ReentrantLock和synchronized關(guān)鍵字的區(qū)別ReentrantLock在等待鎖時可以使用lockInterruptibly()方法選擇中斷, 改為處理其他事情,而synchronized關(guān)鍵字,線程需要一直等待下去。同樣的,tryLock()方法可以設置超時時間,用于在超時時間內(nèi)一直獲取不到鎖時進行中斷。
ReentrantLock可以實現(xiàn)公平鎖,而synchronized的鎖是非公平的。
ReentrantLock擁有方便的方法用于獲取正在等待鎖的線程。
ReentrantLock可以同時綁定多個Condition對象,而synchronized中,鎖對象的wait()和notify()或notifyAll()方法可以實現(xiàn)一個隱含的條件,如果要和多于一個條件關(guān)聯(lián)時,只能再加一個額外的鎖,而ReentrantLock只需要多次調(diào)用newCondition方法即可。
性能比較在JDK1.6之前,ReentrantLock的性能要明顯優(yōu)于synchronized,但是JDK1.6中加入了很多針對鎖的優(yōu)化措施,synchronized和ReentrantLock的性能基本完全持平了。
ReentrantLock缺點ReentrantLock的主要缺點是方法需要置于try-finally塊中,另外,開發(fā)人員需要負責獲取和釋放鎖,而開發(fā)人員常常忘記在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...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66044.html
摘要:基礎問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識點總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機制解讀抽象類與三大特征時間和時間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對象鎖和類鎖的區(qū)別,,優(yōu)缺點及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識點總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機制解讀抽象類與三大特征時間和時間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對象鎖和類鎖的區(qū)別,,優(yōu)缺點及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識點總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機制解讀抽象類與三大特征時間和時間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對象鎖和類鎖的區(qū)別,,優(yōu)缺點及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...
閱讀 2448·2021-10-14 09:42
閱讀 1139·2021-09-22 15:09
閱讀 3545·2021-09-09 09:33
閱讀 3026·2021-09-07 09:59
閱讀 3639·2021-09-03 10:34
閱讀 3532·2021-07-26 22:01
閱讀 2822·2019-08-30 13:06
閱讀 1203·2019-08-30 10:48