共享鎖和排它鎖

共享鎖和排它鎖

以 ReentranReadWriteLock 讀寫鎖爲例java

什麼是共享鎖和排它鎖

排它鎖,又稱獨佔鎖,獨享鎖 synchronized就是一個排它鎖安全

共享鎖,又稱爲讀鎖,得到共享鎖後,能夠查看,但沒法刪除和修改數 據, 其餘線程此時業獲取到共享鎖,也能夠查看可是 沒法修改和 刪除數據ide

共享鎖和排它鎖典型是ReentranReadWriteLock 其中,讀鎖是共享鎖,寫鎖是 排它鎖ui

讀寫鎖的做用

在沒有讀寫鎖以前,咱們使用的是ReentrantLock ,雖然咱們保證了線程安全,,可是業浪費了必定的資源,多個讀操做同時進行,是不會出現線程安全問題spa

讀寫鎖的規則

讀寫鎖只是一把鎖,能夠經過2種方式鎖定,讀鎖定和寫鎖定線程

多個線程取請求讀鎖,均可以請求到的 若是一個線程獲取到了讀鎖,其餘線程須要寫鎖,申請的寫鎖必須得等讀鎖釋放 總結 :要麼多讀,要麼一寫,兩者不可共存設計

ReentranReadWriteLock 具體用法

上代碼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 同樣

圖片

公平鎖:不容許插隊 非公平鎖:寫鎖能夠隨時插隊 讀鎖僅在等待隊列頭節點不是想獲取寫鎖到時候能夠插隊

相關文章
相關標籤/搜索