面試官:ReadWriteLock讀寫之間互斥嗎?
您好,我是路人,更多優(yōu)質(zhì)文章見個人博客:http://itsoku.com
開發(fā)中遇到并發(fā)的問題一般會用到鎖,Synchronized存在明顯的一個性能問題就是讀與讀之間互斥;
ReadWriteLock是JDK5中提供的讀寫分離鎖。讀寫分離鎖可以有效地幫助減少鎖競爭,以提升系統(tǒng)的性能。
ReadWriteLock管理一組鎖,一個是只讀的鎖,一個是寫鎖。
Java并發(fā)庫中ReetrantReadWriteLock實現(xiàn)了ReadWriteLock接口并添加了可重入的特性。
而讀寫鎖ReentrantReadWriteLock:讀讀共享,讀寫互斥,寫寫互斥; 讀寫鎖維護了一對鎖,一個讀鎖,一個寫鎖,通過分離讀鎖和寫鎖,使得并發(fā)性相比一般的排他鎖有了很大提升。在讀多寫少的情況下,讀寫鎖能夠提供比排他鎖更好的并發(fā)性和吞吐量。
從源碼中可以看出,讀寫鎖中同樣依賴隊列同步器Sync(AQS)實現(xiàn)同步功能,而讀寫狀態(tài)就是其同步器的同步狀態(tài)。推薦:Java進(jìn)階視頻資源
下面從例子中來說明:讀讀共享,讀寫互斥,寫寫互斥。
代碼如下:
public class ReentrantWriteReadLockTest {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
ReadLock readLock = lock.readLock();
WriteLock writeLock = lock.writeLock();
public void read(){
try {
readLock.lock();
System.out.println("線程"+Thread.currentThread().getName()+"進(jìn)入。。。");
Thread.sleep(3000);
System.out.println("線程"+Thread.currentThread().getName()+"退出。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
readLock.unlock();
}
}
public void write(){
try {
writeLock.lock();
System.out.println("線程"+Thread.currentThread().getName()+"進(jìn)入。。。");
Thread.sleep(3000);
System.out.println("線程"+Thread.currentThread().getName()+"退出。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
writeLock.unlock();
}
}
public static void main(String[] args) {
final ReentrantWriteReadLockTest wr = new ReentrantWriteReadLockTest();
Thread t1 = new Thread(new Runnable() {
public void run() {
wr.read();
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
public void run() {
wr.read();
}
}, "t2");
Thread t3 = new Thread(new Runnable() {
public void run() {
wr.write();
}
}, "t3");
Thread t4 = new Thread(new Runnable() {
public void run() {
wr.write();
}
}, "t4");
t1.start();
t2.start();
//t3.start();
//t4.start();
}
}
當(dāng)我們啟動線程t1和t2時,結(jié)果如下:
線程t1和t2可以同時進(jìn)入,說明了讀讀共享!
當(dāng)我們啟動線程t2和t3時,結(jié)果如下:
一個線程必須等待另一個線程退出,才能進(jìn)入,說明了讀寫互斥!
當(dāng)我們啟動線程t3和t4時,結(jié)果如下:
一個線程必須等待另一個線程退出,才能進(jìn)入,說明了寫寫互斥!
更多好文章
↓↓↓ 點擊閱讀原文,直達(dá)個人博客
你在看嗎
評論
圖片
表情
