我有一个静态的 HashMap 和三个尝试从相应的类同时访问 HashMap 的线程。
每个线程的任务都是获取指定键的列表值,对列表进行一些操作(修改列表)。并将处理后的列表放入HashMap中。
我想让其他尝试访问HashMap的线程等待,直到当前线程完成处理并修改HashMap。
在某些情况下,流程是这样的,
线程A检索HashMap,当线程A正在对HashMap的列表进行处理时,其他线程B检索HashMap并开始处理。
实际行为必须是这样的:
线程A -> 检索HashMap -> 处理 -> 将值放入HashMap。
线程B -> 检索HashMap -> 处理 -> 将值放入HashMap。
线程 C -> 检索 HashMap -> 处理 -> 将值放入 HashMap。
逻辑:
- 对 HashMap 应用锁定
- 检索。
- 进程。
- 放入HashMap中。
- 释放锁定。
帮助我将逻辑转换为代码,或者任何建议都微笑接受。
最佳答案
你确实可以使用ReentrantReadWriteLock。这是该链接。
Javadoc for ReadWriteReentrant lock
我会像这样实现该功能............
public class Test {
private Map<Object, Object> map = new HashMap<>();
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
public void process() {
methodThatModifiesMap();
methodThatJustReadsmap();
}
private void methodThatModifiesMap() {
//if the code involves modifying the structure of the map like 'put(), remove()' i will acquire the write reentrantReadWriteLock
reentrantReadWriteLock.writeLock().lock();
try {
//DO your thing and put() or remove from map
}
finally {
//Dont forget to unlock
reentrantReadWriteLock.writeLock().unlock();
}
}
private void methodThatJustReadsmap() {
// if all you are doing is reading ie 'get()'
reentrantReadWriteLock.readLock().lock(); // this does not block other reads from other threads as long as there is no writes during this thread's read
try {
} finally {
reentrantReadWriteLock.readLock().unlock();
}
}
}
您的 map 不仅是线程安全的,而且吞吐量也更好。
关于java - 在 HashMap 上应用锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120084/