我在以下实现中使用 ReentrantReadWriteLock
public class BooksData<K, V> {
private final Map<K , V> Books;
private final Logger logger = Logger.getLogger("Books Database");
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
public BooksData(Map<K, V> book) {
this.Books = books;
}
public Map<K, V> getAll() {
readLock.lock();
try {
return Books;
} finally {
readLock.unlock();
}
}
public V get(K key){
readLock.lock();
try {
if (Books.containsKey(key)){
return Books.get(key);
} else return null;
}finally {
readLock.unlock();
}
}
public void add(V value, K key){
writeLock.lock();
try {
Books.put(key, value);
}finally {
writeLock.unlock();
}
}
public void update(V value, K key) {
writeLock.lock();
try {
Books.put(key, value);
}
catch (Exception e) {
logError(e);
} finally {
writeLock.unlock();
}
}
public void remove(K key) {
writeLock.lock();
try {
Books.remove(key);
} finally {
writeLock.unlock();
}
}
private void logError (Exception e){
logger.log(Level.SEVERE,e.getMessage());
}
}
它工作正常,但这里的问题是每当我想添加或更新一个值时,整个 Map 都被锁定并且效率不高,我如何编辑代码以使其仅锁定正在修改的值。例如,如果我想通过调用来更新值 A ;
update(A,A.getId());
该值被锁定,在通过 update 方法更新之前,其他线程无法读取或修改它,但同时可以修改具有不同键的其他值。
有关如何使用读写锁仅锁定地图中的一项(如果正在修改而不是锁定整个地图)的任何提示?