3.10 ReentrantReadWriteLock
ReadWriteLock即讀寫鎖,ReadWriteLock的規則如下,
a.當有執行緒獲取了Write鎖時,其他執行緒不能獲取到任何鎖(寫鎖和讀鎖都不能,
b.當沒有執行緒獲取Wrete鎖時,所有執行緒都可以獲取Read鎖,
c.當有Read鎖存在時,獲取不到Write鎖,
3.10.1 ReentrantReadWriteLock實作類繼承關系

可見該類實作了ReadWriteLock介面,
3.10.2 ReentrantReadWriteLock使用
創建一個讀寫鎖,
static ReadWriteLock lock = new ReentrantReadWriteLock();
獲取寫鎖,
lock.writeLock().lock();
釋放寫鎖,
lock.writeLock().unlock();
獲取讀鎖,
lock.readLock().lock();
釋放讀鎖,
lock.readLock().unlock();
3.10.3 ReentrantReadWriteLock使用實體
該實體測驗的是上邊的規則c——當有Read鎖存在時,獲取不到Write鎖,讓一個執行緒先獲取到讀鎖并持有5秒鐘,這是其他執行緒嘗試去獲取寫鎖,發現5秒之后其他執行緒再開始寫入然后在控制臺列印出結果,
class ReadWriteLockDemo{
static ReadWriteLock lock = new ReentrantReadWriteLock();
static String text = "hello";
public static void modify(){
lock.writeLock().lock();
try {
System.err.println(Thread.currentThread().getName()+"開始修改");
text += " "+Thread.currentThread().getName();
}catch (Exception e){
e.printStackTrace();
}
finally {
lock.writeLock().unlock();
}
}
public static void readWithReadLock(){
lock.readLock().lock();
try {
System.err.println(text);
Thread.sleep(5000);
System.err.println("5秒過去了");
}catch (Exception e){
}finally {
lock.readLock().unlock();
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
readWithReadLock();
}).start();
Thread.sleep(1000);
for (int i=0;i<10;i++) {
new Thread(() -> {
modify();
}).start();
}
}
}

使用讀寫鎖時需要需要明確上述三條規則,并且可知,當讀很多時,很難寫入,所以讀寫鎖不適用于讀和寫都很多的情況,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258931.html
標籤:java
