Java多线程之ReentrantReadWriteLock
? ? ? ? 一、鎖的種類和含義 ? ? ? ?
? ? ? ? Java的concurrent并發包中,存在兩種類型的鎖,即共享鎖和排它鎖,后者也叫做獨占鎖。
? ? ? ? 共享鎖是指某一時刻鎖可以被多個線程同時擁有,這些線程同時共享該鎖。而排它鎖則是指鎖在某一時刻只能被一個線程擁有,任何想要獲得該鎖的線程,必須等待的鎖的所有者釋放后才可以。
? ? ? ? 二、ReentrantReadWriteLock的含義
? ? ? ? ReentrantReadWriteLock是Java中的一種讀寫鎖,它既不是完全的共享鎖,也不是完全的排它鎖。它實際上是一種混合形式的鎖,既包含共享鎖,同時也包含排它鎖。
? ? ? ? 這么做是為了什么呢?我們知道,很多情況下有這樣一種業務場景,即對于一塊數據,或者一個對象,即存在需要讀取的時候,也存在需要修改,即寫入的時候。那么,如果對于這種應用場景,如果是只用共享鎖,同一時刻,允許多個線程讀取和寫入數據,那么數據操作的原子性就無法得到保證,在多并發的情況下,數據往往就是紊亂的;如果是只用排它鎖,即某一線程讀取的時候,即不允許其它線程寫入,也不允許其它線程讀取,這樣是能保證數據操作的原子性,得到正確的數據,那么性能也隨之降低了。
? ? ? ? 所以,在兼顧數據操作的原子性和讀寫性能二者的情況下,一種同時融合共享鎖和排它鎖的混合鎖的產生,就顯得特別有意義了。這就是我們本文將要闡述的讀寫鎖ReentrantReadWriteLock。
? ? ? ? 它在讀取數據或對象的時候使用讀鎖,即一種對讀共享同時讀寫排它的鎖,允許多個線程同時讀取數據,但是不允許其它線程修改數據;而在修改數據或對象時使用寫鎖,一種完全的排它鎖,既不允許 其它線程讀取數據,也不允許其他線程修改數據。這樣,數據操作的原子性和性能同時得到了考慮。
? ? ? ? 三、ReentrantReadWriteLock的定義及實現
? ? ? ??ReentrantReadWriteLock實現了Java中的ReadWriteLock接口。
? ? ? ? 四、ReentrantReadWriteLock的使用方式及代碼示例
? ? ? ? ReentrantReadWriteLock的使用方式如下:
? ? ? ? 首先,需要構造一個ReentrantReadWriteLock對象rrwl。代碼如下:
// 構造ReentrantReadWriteLock對象rrwlprivate ReentrantReadWriteLock rrwl = new ReentrantReadWriteLock();? ? ? ? 其次,需要獲取ReentrantReadWriteLock對象rrwl的讀鎖readLock和寫鎖writeLock。代碼如下:// 獲取讀鎖readLock:可被多個讀線程共享,但是會排斥所有的寫線程private Lock readLock = rrwl.readLock();// 獲取寫鎖writeLock:排斥所有的讀線程和其它寫線程private Lock writeLock = rrwl.writeLock();? ? ? ? 然后,讀鎖的使用方法如下: // 讀鎖的使用public Object readObject() {Object object = null;// 利用讀鎖readLock獲取讀鎖readLock.lock();try {// 此處為業務代碼object = new Object();} finally {// 利用讀鎖readLock釋放讀鎖readLock.unlock();}return object;}? ? ? ? 最后,寫鎖的使用方法如下: // 寫鎖的使用public void writeObject(Object object) {// 利用寫鎖writeLock獲取寫鎖writeLock.lock();try {// 此處為業務代碼} finally {// 利用寫鎖writeLock釋放寫鎖writeLock.unlock();}}
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的Java多线程之ReentrantReadWriteLock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis学习笔记(3)-入门程序一
- 下一篇: android中使用DisplayMet