java并發(fā)編程中ReentrantLock可重入讀寫鎖_第1頁
java并發(fā)編程中ReentrantLock可重入讀寫鎖_第2頁
java并發(fā)編程中ReentrantLock可重入讀寫鎖_第3頁
java并發(fā)編程中ReentrantLock可重入讀寫鎖_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第java并發(fā)編程中ReentrantLock可重入讀寫鎖目錄一、ReentrantLock可重入鎖二、ReentrantReadWriteLock讀寫鎖三、讀鎖之間不互斥

一、ReentrantLock可重入鎖

可重入鎖ReentrantLock是一個互斥鎖,即同一時間只有一個線程能夠獲取鎖定資源,執(zhí)行鎖定范圍內(nèi)的代碼。這一點與synchronized關(guān)鍵字十分相似。其基本用法代碼如下:

Locklock=newReentrantLock();//實例化鎖

//lock.lock();//上鎖

booleanlocked=lock.tryLock();//嘗試上鎖

if(locked){

try{

//被鎖定的同步代碼塊,同時只能被一個線程執(zhí)行

}finally{

lock.unlock();//放在finally代碼塊中,保證鎖一定會被釋放

通過lock函數(shù)獲取鎖,通過unlock函數(shù)釋放鎖。非常重要的是,需要把需要同步執(zhí)行的代碼放入try/finally代碼塊中,并在finally中將鎖釋放。ReentrantLock是可重入鎖,即:(lock/unlok)動作里面可以嵌套(lock/unlock),針對同一個鎖可以多次嵌套使用,不會產(chǎn)生死鎖。但是lock函數(shù)與unlock函數(shù)在代碼中必須成對出現(xiàn),否則會出現(xiàn)死鎖。

二、ReentrantReadWriteLock讀寫鎖

ReentrantReadWriteLock類為讀寫鎖實現(xiàn)類,針對某一個對象或可變變量,只要沒有線程在修改它,這個對象或可變變量就可以同時被多個線程讀取。ReentrantReadWriteLock將鎖分為讀鎖和寫鎖,只要沒有線程持有寫鎖的情況下,讀鎖可以由多個線程同時持有。

讀鎖-如果沒有線程獲取或請求寫鎖,那么多個線程可以獲取讀鎖寫鎖-如果沒有線程在讀或?qū)?,那么只有一個線程可以獲得寫鎖

簡單的說就是ReentrantReadWriteLock可以保證最多同時有一個線程在寫數(shù)據(jù),或者可以同時有多個線程讀數(shù)據(jù)。因此使用ReentrantReadWriteLock,在讀操作比寫操作更頻繁的情況下,可以提高程序的性能和吞吐量。

下面我們用一個簡單的例子,來解讀一下如何應(yīng)用讀寫鎖。

publicclassTestReadWriteLock{

//可以同時執(zhí)行3個線程任務(wù)的線程池

ExecutorServiceexecutor=Executors.newFixedThreadPool(3);

//讀寫目標(biāo),寫線程放入數(shù)據(jù)到map,讀線程從map讀取數(shù)據(jù)

MapString,Stringmap=newHashMap();

//讀寫鎖操作對象

ReadWriteLocklock=newReentrantReadWriteLock();

//寫操作函數(shù)

publicvoidwrite(){

executor.submit(()-{//線程池提交寫操作任務(wù)

lock.writeLock().lock();//加寫鎖

try{

map.put("key","val");//寫數(shù)據(jù)操作

Thread.sleep(2000);

}catch(InterruptedExceptione){

e.printStackTrace();

}finally{

lock.writeLock().unlock();//釋放寫鎖

//讀操作函數(shù)

publicvoidread(){

lock.readLock().lock();//加讀鎖

System.out.println(Thread.currentThread().getName()+"加讀鎖");

try{

System.out.println(map.get("key"));//讀數(shù)據(jù)操作

}finally{

lock.readLock().unlock();//釋放讀鎖

System.out.println(Thread.currentThread().getName()+"釋放讀鎖");

三、讀鎖之間不互斥

我們寫一個測試方法,通過打印輸出來理解讀寫鎖控制代碼的執(zhí)行順序。

//測試

publicstaticvoidmain(String[]args){

TestReadWriteLocktest=newTestReadWriteLock();

test.write();//提交一次寫操作任務(wù),寫一條數(shù)據(jù)

RunnablereadTask=test::read;//線程方法read,實現(xiàn)線程Runnable接口的簡便寫法

test.executor.submit(readTask);//讀1次(新讀線程)

test.executor.submit(readTask);//讀2次(新讀線程)

test.executor.shutdown();

執(zhí)行上面的代碼,可能會出現(xiàn)下面的輸出

pool-1-thread-2加讀鎖

pool-1-thread-3加讀鎖

val

val

pool-1-thread-3釋放讀鎖

pool-1-thread-2釋放讀鎖

在pool-1-thread-2沒有釋放讀鎖情況下,pool-1-thread-3可以再次加讀鎖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論