Java中的ReentrantReadWriteLock使用詳解
ReentrantReadWriteLock
ReadWriteLock即讀寫鎖,ReadWriteLock的規(guī)則如下。
a.當(dāng)有線程獲取了Write鎖時(shí),其他線程不能獲取到任何鎖(寫鎖和讀鎖都不能。
b.當(dāng)沒有線程獲取Wrete鎖時(shí),所有線程都可以獲取Read鎖。
c.當(dāng)有Read鎖存在時(shí),獲取不到Write鎖。
1 ReentrantReadWriteLock實(shí)現(xiàn)類繼承關(guān)系

可見該類實(shí)現(xiàn)了ReadWriteLock接口。
2 ReentrantReadWriteLock使用
創(chuàng)建一個(gè)讀寫鎖。
static ReadWriteLock lock = new ReentrantReadWriteLock();
獲取寫鎖。
lock.writeLock().lock();
釋放寫鎖。
lock.writeLock().unlock();
獲取讀鎖。
lock.readLock().lock();
釋放讀鎖。
lock.readLock().unlock();
3 ReentrantReadWriteLock使用實(shí)例
該實(shí)例測試的是上邊的規(guī)則c——當(dāng)有Read鎖存在時(shí),獲取不到Write鎖。
讓一個(gè)線程先獲取到讀鎖并持有5秒鐘。
這是其他線程嘗試去獲取寫鎖,發(fā)現(xiàn)5秒之后其他線程再開始寫入然后在控制臺(tái)打印出結(jié)果。
class ReadWriteLockDemo{
static ReadWriteLock lock = new ReentrantReadWriteLock();
static String text = "hello";
public static void modify(){
lock.writeLock().lock();
try {
System.err.println(Thread.currentThread().getName()+"開始修改");
text += " "+Thread.currentThread().getName();
}catch (Exception e){
e.printStackTrace();
}
finally {
lock.writeLock().unlock();
}
}
public static void readWithReadLock(){
lock.readLock().lock();
try {
System.err.println(text);
Thread.sleep(5000);
System.err.println("5秒過去了");
}catch (Exception e){
}finally {
lock.readLock().unlock();
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
readWithReadLock();
}).start();
Thread.sleep(1000);
for (int i=0;i<10;i++) {
new Thread(() -> {
modify();
}).start();
}
}
}
使用讀寫鎖時(shí)需要需要明確上述三條規(guī)則。
并且可知,當(dāng)讀很多時(shí),很難寫入,所以讀寫鎖不適用于讀和寫都很多的情況。
到此這篇關(guān)于Java中的ReentrantReadWriteLock使用詳解的文章就介紹到這了,更多相關(guān)ReentrantReadWriteLock使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java連接MySQL數(shù)據(jù)庫命令行程序過程
SQL編程包括兩種形式,一種是過程化編程,主要通過數(shù)據(jù)庫交互式工具,通過存儲(chǔ)過程、觸發(fā)器、函數(shù)等形式的編程;另一種是嵌入式SQL編程,將SQL語句嵌入到高級(jí)開發(fā)語言,完成數(shù)據(jù)的各種操作2021-10-10
SpringBoot feign動(dòng)態(tài)設(shè)置數(shù)據(jù)源(https請(qǐng)求)
這篇文章主要介紹了SpringBoot如何在運(yùn)行時(shí)feign動(dòng)態(tài)添加數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08
Java線程同步機(jī)制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在之前,已經(jīng)學(xué)習(xí)到了線程的創(chuàng)建和狀態(tài)控制,但是每個(gè)線程之間幾乎都沒有什么太大的聯(lián)系??墒怯械臅r(shí)候,可能存在多個(gè)線程多同一個(gè)數(shù)據(jù)進(jìn)行操作,這樣,可能就會(huì)引用各種奇怪的問題?,F(xiàn)在就來學(xué)習(xí)多線程對(duì)數(shù)據(jù)訪問的控制吧2017-05-05
Spring Boot集成LangChain來實(shí)現(xiàn)Rag應(yīng)用的問題小結(jié)
檢索增強(qiáng)生成(RAG)是一種優(yōu)化大型語言模型(LLM)輸出的技術(shù),通過引用權(quán)威知識(shí)庫以增強(qiáng)模型的準(zhǔn)確性和相關(guān)性,RAG允許LLM在不重新訓(xùn)練的情況下訪問特定領(lǐng)域的知識(shí),提高了其在各種應(yīng)用中的實(shí)用性和信任度,感興趣的朋友跟隨小編一起看看吧2024-09-09
徹底理解Spring注解@Autowired實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)的介紹了Spring注解@Autowired實(shí)現(xiàn)的原理,縝密的邏輯分析,實(shí)踐應(yīng)用示例操作說明,讓大家徹底的理解Spring注解@Autowired背后實(shí)現(xiàn)原理2022-03-03

