Java多執行緒19:ReentrantReadWriteLock類
阿新 • • 發佈:2018-12-15
類ReentrantLock具有完全互斥排他的效果,即同一時間只有一個執行緒在執行ReentrantLock.lock()方法後面的任務。這樣做雖然保證了例項變數的執行緒安全性,但效率確是非常低下的。所以在JDK中提供了一種讀寫鎖ReentrantReadWriteLock類,使用它可以加快執行效率,在某些不需要操作例項變數的方法中,完全可以使用讀寫鎖ReentrantrReadWriteLock來提升該方法的程式碼執行速度。 讀寫鎖表示也有兩個鎖,一個是讀操作相關的鎖,也稱為共享鎖;另一個是寫操作相關的鎖,也叫排他鎖。也就是多個執行緒讀鎖之間不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥。在沒有執行緒Thread進行寫入操作時,進行讀取操作的多個Thread都可以獲取讀鎖,而進行寫入操作的Thread只有在獲取寫鎖後才能進行寫入操作。即多個Thread可以同時進行讀取操作, 但是同一時刻只允許一個Thread進行寫入操作。
讀讀共享
package unit4; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Demo2_Run { public static void main(String[] args) { Demo2_Service service = new Demo2_Service(); ThreadA threadA = new ThreadA(service); threadA.setName("A"); ThreadB threadB = new ThreadB(service); threadB.setName("B"); threadA.start(); threadB.start(); } } class ThreadA extends Thread { private Demo2_Service service; public ThreadA(Demo2_Service service) { super(); this.service = service; } public void run() { service.read(); } } class ThreadB extends Thread { private Demo2_Service service; public ThreadB(Demo2_Service service) { super(); this.service = service; } public void run() { service.read(); } } class Demo2_Service { private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public void read() { lock.readLock().lock(); System.out.println("獲得讀鎖" + Thread.currentThread().getName() + " " + System.currentTimeMillis()); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } } }