下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026重慶市涪陵區(qū)武陵山鎮(zhèn)人民政府招聘公益性崗位1人參考考試題庫附答案解析
- 2025年湖口縣應(yīng)急管理局面向社會公開招聘工作人員參考考試試題附答案解析
- 2026河北雄安人才服務(wù)有限公司招聘53人備考考試試題附答案解析
- 2026上海交通大學(xué)醫(yī)學(xué)院招聘91人參考考試題庫附答案解析
- 2026浙江自然博物院(安吉館)招聘編外人員1人參考考試題庫附答案解析
- 2026山東濰坊瀚聲學(xué)校招聘生活老師備考考試試題附答案解析
- 2026年度威海榮成市事業(yè)單位公開招聘初級綜合類崗位人員(84人)備考考試試題附答案解析
- 2026年畜禽屠宰場火災(zāi)應(yīng)急救援預(yù)案演練方案
- 保密常識保密涉密載體管理最佳實踐題庫及答案
- 酒店人事部員工培訓(xùn)管理制度
- 腎囊腫護理查房要點
- 2025年掛面制造行業(yè)研究報告及未來發(fā)展趨勢預(yù)測
- 7.1《集體生活成就我》課件 2025-2026道德與法治七年級上冊 統(tǒng)編版
- 艾媒咨詢2025年中國新式茶飲大數(shù)據(jù)研究及消費行為調(diào)查數(shù)據(jù)
- 遼寧省錦州市2024-2025學(xué)年八年級下學(xué)期期末物理試題(含答案)
- 頂管施工臨時用電方案
- 廣東省惠州市高三上學(xué)期第一次調(diào)研考英語試題-1
- 瀘州老窖釀酒有限責(zé)任公司釀酒廢棄物熱化學(xué)能源化與資源化耦合利用技術(shù)環(huán)評報告
- 單位微信群規(guī)定管理制度
- 公司人員服從管理制度
- 床上護理洗頭課件
評論
0/150
提交評論