1. 程式人生 > >Java多執行緒19:ReentrantReadWriteLock類

Java多執行緒19:ReentrantReadWriteLock類

類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();
		}
	}
}

在這裡插入圖片描述