讀寫鎖,介面ReadWriteLock,實現類ReentrantReadWriteLock
阿新 • • 發佈:2021-02-15
技術標籤:# JUC
讀寫鎖演示
/**
* 獨佔鎖(寫入) 一次只能被一個執行緒佔有
* 共享鎖(讀取) 多個執行緒可以同時佔有
* =================================
* 讀寫鎖
* 讀和讀 可以共存
* 讀和寫 不可以共存
* 寫和寫 不可以共存
*
*/
public static void main(String[] args) {
ReadWrite readWrite = new ReadWrite();
for (int i = 1; i <= 5; i++) {
final int temp = i;
new Thread(() -> {
// 寫入操作
readWrite.write(temp + "", temp + "");
}, String.valueOf(i)).start();
}
for (int i = 1; i <= 5; i++) {
/ ////////////////
final int temp = i;
new Thread(() -> {
// 寫入操作
readWrite.read(temp + "");
}, String.valueOf(i)).start();
}
}
}
// 資源類
class ReadWrite {
private volatile Map<String, Object> map = new HashMap<> ();
// 讀寫鎖
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 寫入,同時只能有一個執行緒寫,不能插隊,保證原子性
public void write(String key, Object value) {
// 加鎖
readWriteLock.writeLock().lock();
// 業務邏輯
try {
System.out.println(Thread.currentThread().getName() + "開始寫入");
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "寫入完成");
}catch (Exception e) {
e.printStackTrace();
}finally {
// 解鎖
readWriteLock.writeLock().unlock();
}
}
// 讀出,可以同時讓所有執行緒讀
public void read(String key) {
// 加鎖
readWriteLock.readLock().lock();
// 業務邏輯
try {
System.out.println(Thread.currentThread().getName() + "開始讀");
Object o = map.get(key);
System.out.println(Thread.currentThread().getName() + "讀完成");
}catch (Exception e) {
e.printStackTrace();
}finally {
// 解鎖
readWriteLock.readLock().unlock();
}
}
}