ReentrantReadWriteLock讀寫(xiě)鎖
public class ReentrantReadWriteLock extends Object implements Object implements ReadWriteLock, Serializable1.可重入,可重入的意思當(dāng)前線程已獲該鎖,還可以再獲取,但是讀寫(xiě)鎖里,WriteLock可以獲取ReadLock,但是ReadLock不能獲取WriteLock
2.WriteLock可以降級(jí)為ReadLock,意思是:先獲取WriteLock,在獲取ReadLock,釋放WriteLock,這時(shí)候線程就將keep ReadLock,但是如果ReadLock想要升級(jí)為WriteLock,則不可能,因?yàn)楦鶕?jù)讀寫(xiě)鎖的可重入特性,ReadLock排斥所有WriteLock,也就是(1)特性
3.ReadLock可以被多個(gè)線程持有并在作用時(shí)排斥任何WriteLock,而WriteLock隔離性比ReadLock高,它是完全的排斥,根據(jù)這一特性,讀寫(xiě)鎖適合高頻率讀,但不適合高頻率寫(xiě)
4.不管是ReadLock,WriteLock都支持Interrupt
5.WriteLock支持Condition,但是ReadLock不支持Condition,將拋出
UnsupportedOperationException
。下面是個(gè)小例子:
package com.google.study;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
public class ReentrantLockStudy {
private Map<Integer, Result> map = new ConcurrentHashMap<Integer, Result>();
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final WriteLock writeLock = lock.writeLock();
private final ReadLock readLock = lock.readLock();
public Result get(Integer key) {
Result value = null;
readLock.lock();// 獲取讀鎖
try {
value = map.get(key);
if (value == null) {// 如果沒(méi)有該結(jié)果
readLock.unlock();// 必須釋放讀鎖
writeLock.lock();// 獲取寫(xiě)鎖
value = map.get(key);
if (value == null) {
value = getResult();
map.put(key, value);
}
readLock.lock();// 重新降級(jí)為讀鎖
writeLock.unlock();
}
} catch (Exception e) {
writeLock.unlock();
e.printStackTrace();
} finally {
readLock.unlock();
}
return value;
}
public void put(Integer key, Result value) {
writeLock.lock();
try {
map.put(key, value);
} finally {
writeLock.unlock();
}
}
private Result getResult() {
return new Result();
}
private static class Result {
}
}
posted on 2010-10-31 23:31 羔羊 閱讀(975) 評(píng)論(0) 編輯 收藏 所屬分類: concurrent