0

我在以下实现中使用 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 方法更新之前,其他线程无法读取或修改它,但同时可以修改具有不同键的其他值。

有关如何使用读写锁仅锁定地图中的一项(如果正在修改而不是锁定整个地图)的任何提示?

4

0 回答 0