讀寫鎖的核心是實現讀與寫的分離,在高併發的情況下,尤其是讀多寫少的情況下,性能要遠高於重入鎖.對於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關鍵字