生活随笔
收集整理的這篇文章主要介紹了
共享锁和排它锁的用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
共享鎖和排它鎖
- 排它鎖,又稱為獨占鎖、獨享鎖
- 共享鎖,又稱為讀鎖,獲得共享鎖之后,可以查看但無法修改和刪除數據,其他線程此時也可以獲取到共享鎖,也可以查看,但無法修改和刪除數據
- 共享鎖和排它鎖的典型是讀寫鎖ReentrantReadWriteLock,其中讀鎖是共享鎖,寫鎖是排它鎖
讀寫鎖的作用
- 在沒有讀寫鎖之前,我們設定使用ReentrantLock,那么雖然我們保證了線程安全,但是也浪費了資源:多個讀操作同時進行,并沒有線程安全問題
- 在讀的地方使用讀鎖,在寫的地方使用寫鎖,靈活控制,如果沒有寫鎖的情況下,讀是無阻塞的,提高了程序的執行效率
讀寫鎖的規則
- 多個線程只申請讀鎖,都可以申請到
- 如果有一個線程已經占用了讀鎖,則此時其他線程如果要申請寫鎖,則申請寫鎖的線程會一直等待釋放讀鎖
- 如果有一個線程已經占用了寫鎖,則此時其他線程如果申請寫鎖或者讀鎖,則申請的線程會一直等待釋放寫鎖
- 一句話總結:要么是一個或多個線程同時有讀鎖,要么是一個線程有寫鎖,但是兩者不會同時出現
- 換一種思路更容易理解:讀寫鎖只是一把鎖,可以通過兩種方式鎖定:讀鎖定和寫鎖定。讀寫鎖可以同時被一個或多個線程讀鎖定,也可以被單一線程寫鎖定。但是永遠不能同時對這把鎖進行讀鎖定和寫鎖定
package lock.readwrite;import java.util.concurrent.locks.ReentrantReadWriteLock;public class CinemaReadWrite {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 (InterruptedException e) {e.printStackTrace();} 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 (InterruptedException e) {e.printStackTrace();} finally {System.out.println(Thread.currentThread().getName() + "釋放寫鎖");writeLock.unlock();}}public static void main(String[] args) {new Thread(()->read(),"Thread1").start();new Thread(()->read(),"Thread2").start();new Thread(()->write(),"Thread3").start();new Thread(()->write(),"Thread4").start();}
}
?
總結
以上是生活随笔為你收集整理的共享锁和排它锁的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。