文章目錄
- 🛸情景引入
- ?解決問題

readLock()和writeLock()都是ReadWriteLock接口中定義的方法,用于獲取讀鎖和寫鎖。
readLock()
方法返回一個讀鎖,允許多個線程同時獲取該鎖,以進行并發讀取操作。如果當前已有一個寫鎖或其他線程正在請求寫鎖,則讀鎖會被阻塞,直到所有寫鎖請求完成并釋放鎖為止。讀鎖和寫鎖之間是互斥的。
writeLock()
方法返回一個寫鎖,只允許一個線程獲取該鎖,以進行寫入操作。如果當前已有一個讀鎖或其他線程正在請求讀鎖,則寫鎖會被阻塞,直到所有讀鎖請求完成并釋放鎖為止。寫鎖是獨占的,同一時間只能有一個線程持有寫鎖。
在使用讀寫鎖時,應該根據具體的業務場景和需求選擇適當的鎖類型。如果共享資源的讀取操作遠遠超過寫入操作,那么使用讀寫鎖可以提高系統的并發性能。如果寫入操作非常頻繁,那么使用讀寫鎖可能會導致讀取操作的性能下降,因為讀取線程需要等待寫入線程釋放寫鎖。此外,讀寫鎖也需要消耗額外的系統資源,因此應該避免不必要的鎖競爭。
🛸情景引入
我們先看下面這段代碼
本來應該是1寫入,然后1寫入完全
但是現在1寫入后,緊跟著的是3寫入
這明顯是錯誤的
?解決問題
下面我們來加上鎖,解決問題
package org.Test6;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockDemo {public static void main(String[] args) {MyCacheLock myCache = new MyCacheLock();//寫入for(int i=1;i<=5;i++){final int temp=i;new Thread(()->{myCache.put(temp+"",temp+"");},String.valueOf(i)).start();}//讀取for(int i=1;i<=5;i++){final int temp=i;new Thread(()->{myCache.get(temp+"");},String.valueOf(i)).start();}}
}//自定義緩存
class MyCacheLock{private volatile Map<String,Object> map = new HashMap<>();private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();//存 寫 寫入的時候// 只希望只有一個線程去寫public void put(String key,Object value){readWriteLock.writeLock().lock(); //加鎖try {System.out.println(Thread.currentThread().getName()+"寫入"+key);map.put("key","value");System.out.println(Thread.currentThread().getName()+"寫入結束");} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.writeLock().unlock(); //解鎖}}//取 讀//讀的時候,所有人都可以讀public void get(String key){readWriteLock.readLock().lock(); //加鎖try {System.out.println(Thread.currentThread().getName()+"讀取"+key);Object o=map.get("key");System.out.println(Thread.currentThread().getName()+"讀取結束");} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.readLock().unlock(); //解鎖}}
}
這段代碼中,讀操作和寫操作的主要區別在于使用的鎖不同,
讀操作
使用ReadWriteLock
實例中的readLock()獲取讀鎖,而寫操作
使用writeLock()
獲取寫鎖。
讀寫鎖允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。因此,在讀操作中,多個線程可以同時獲得讀鎖并讀取共享資源,而寫操作需要獲取排他的寫鎖,以防止其他線程同時寫入共享資源。
在MyCacheLock中,put()方法使用writeLock()獲取寫鎖,以確保只有一個線程在寫入數據時修改共享資源,而get()方法使用readLock()獲取讀鎖,允許多個線程同時讀取數據。
這種讀寫鎖的機制可以提高并發性能,因為允許多個線程同時讀取共享資源,而不會產生數據沖突,同時通過只允許一個線程寫入共享資源,可以避免寫操作的數據競爭和不一致性。
獨占鎖(寫鎖):一次只能被一個線程占有
共享鎖(讀鎖):多個線程可以同時占有
在技術的道路上,我們不斷探索、不斷前行,不斷面對挑戰、不斷突破自我。科技的發展改變著世界,而我們作為技術人員,也在這個過程中書寫著自己的篇章。讓我們攜手并進,共同努力,開創美好的未來!愿我們在科技的征途上不斷奮進,創造出更加美好、更加智能的明天!