ReentrantReadWriteLock_讀寫鎖

   讀寫鎖的核心是實現讀與寫的分離,在高併發的情況下,尤其是讀多寫少的情況下,性能要遠高於重入鎖.對於Synchronize,ReentrantLock時,同一個時間內,只能由一個線程進行訪問被鎖定的代碼,而讀寫鎖則不同,其本質是分成兩個鎖,即讀鎖和寫鎖. 在讀鎖下,多個線程可以併發的進行訪問,但是在寫鎖的時候,只能一個個的順序訪問.
   讀讀共享,寫寫互斥,讀寫互斥
一、讀寫鎖代碼示例

public class UseReentrantReadWriteLock {

	private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
	private ReadLock readLock = rwLock.readLock();
	private WriteLock writeLock = rwLock.writeLock();
	
	public void read(){
		try {
			readLock.lock();
			System.out.println("當前線程:" + Thread.currentThread().getName() + "進入...");
			Thread.sleep(3000);
			System.out.println("當前線程:" + Thread.currentThread().getName() + "退出...");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			readLock.unlock();
		}
	}
	
	public void write(){
		try {
			writeLock.lock();
			System.out.println("當前線程:" + Thread.currentThread().getName() + "進入...");
			Thread.sleep(3000);
			System.out.println("當前線程:" + Thread.currentThread().getName() + "退出...");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			writeLock.unlock();
		}
	}
	
	public static void main(String[] args) {
		
		final UseReentrantReadWriteLock urrw = new UseReentrantReadWriteLock();
		
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				urrw.read();
			}
		}, "t1");
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				urrw.read();
			}
		}, "t2");
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				urrw.write();
			}
		}, "t3");
		Thread t4 = new Thread(new Runnable() {
			@Override
			public void run() {
				urrw.write();
			}
		}, "t4");		
		
//		t1.start();
//		t2.start();
		
//		t1.start(); // R 
//		t3.start(); // W
		
		t3.start();
		t4.start();
		
		
	}
}

一、鎖的優化

   1.避免死鎖
   2.減少鎖的持有時間
   3.減少鎖的粒度
   4.鎖的分離
   5.儘量使用無鎖的操作,如:原子操作(Automic系列類),volatile關鍵字

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章