每天一例多執行緒[day21]-----ReentrantReadWriteLock
ReentrantReadWriteLock,讀寫鎖,核心就是實現讀寫分離的鎖,在高併發訪問下,尤其是讀多寫少的場景下,效能要遠遠高於重入鎖。之前的ReentrantLock和Synchronized在同一時間內只能有一個執行緒訪問被鎖定的程式碼,那麼讀寫鎖則不同,其本質時分成兩個鎖,讀鎖+寫鎖,在讀鎖下,多個執行緒可以併發地訪問;但是在寫鎖的時候只能一個一個順序訪問。
總結:讀讀共享,讀寫互斥,寫寫互斥。
-
import java.util.concurrent.locks.ReentrantReadWriteLock;
-
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
-
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
-
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();//R
-
// t2.start();//R
-
//讀寫互斥
-
// t1.start(); // R
-
// t3.start(); // W
-
//寫寫互斥
-
t3.start();//W
-
t4.start();//W
-
}
-
}
分析:在兩個執行緒一起訪問的是一個被讀鎖鎖定的方法時,可以一起進入讀取資料,相當於資料是共享的。但是如果一個訪問的是讀鎖鎖定的方法,一個訪問的是寫鎖鎖定的方法,則相當於訪問的是同一把鎖,只能等一個訪問完釋放後,另外一個執行緒才能繼續訪問,寫寫亦然。