以 ReentranReadWriteLock 讀寫鎖爲例java
排它鎖,又稱獨佔鎖,獨享鎖 synchronized就是一個排它鎖安全
共享鎖,又稱爲讀鎖,得到共享鎖後,能夠查看,但沒法刪除和修改數 據, 其餘線程此時業獲取到共享鎖,也能夠查看可是 沒法修改和 刪除數據ide
共享鎖和排它鎖典型是ReentranReadWriteLock 其中,讀鎖是共享鎖,寫鎖是 排它鎖ui
在沒有讀寫鎖以前,咱們使用的是ReentrantLock ,雖然咱們保證了線程安全,,可是業浪費了必定的資源,多個讀操做同時進行,是不會出現線程安全問題spa
讀寫鎖只是一把鎖,能夠經過2種方式鎖定,讀鎖定和寫鎖定線程
多個線程取請求讀鎖,均可以請求到的 若是一個線程獲取到了讀鎖,其餘線程須要寫鎖,申請的寫鎖必須得等讀鎖釋放 總結 :要麼多讀,要麼一寫,兩者不可共存設計
上代碼code
package com.yxl.po;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class a {
//建立讀寫鎖
private static ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();
//建立讀鎖
private static ReentrantReadWriteLock.ReadLock readLock=reentrantReadWriteLock.readLock();
//建立寫鎖
private static ReentrantReadWriteLock.WriteLock writeLock=reentrantReadWriteLock.writeLock();
//讀鎖方法
private static void read(){
readLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"獲得了讀鎖");
Thread.sleep(1000);
}catch (Exception e){
}finally {
System.out.println(Thread.currentThread().getName()+"釋放讀鎖");
readLock.unlock();
}
}
//寫鎖方法
private static void write(){
writeLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"獲得了寫鎖");
Thread.sleep(1000);
}catch (Exception e){
}finally {
System.out.println(Thread.currentThread().getName()+"釋放寫鎖");
writeLock.unlock();
}
}
public static void main(String[] args) {
new Thread(()->read(),"T1").start();
new Thread(()->read(),"T2").start();
new Thread(()->write(),"T3").start();
new Thread(()->write(),"T4").start();
}
}
從運行結果能夠、看到 讀鎖 線程1 和 2 均可以一塊兒獲取到 而寫鎖必須得獲取釋放,下一個線程才能獲取orm
插隊: 不容許讀鎖插隊 升降級 容許降級,不容許升級,blog
是不是公平策略 ,和 ReentranLock 同樣 傳入true ,false
底層設計思路和ReentranLock 同樣
公平鎖:不容許插隊 非公平鎖:寫鎖能夠隨時插隊 讀鎖僅在等待隊列頭節點不是想獲取寫鎖到時候能夠插隊