gpt4 book ai didi

java - 在 HashMap 上应用锁

转载 作者:行者123 更新时间:2023-12-01 17:58:00 26 4
gpt4 key购买 nike

我有一个静态的 HashMap 和三个尝试从相应的类同时访问 HashMap 的线程。

每个线程的任务都是获取指定键的列表值,对列表进行一些操作(修改列表)。并将处理后的列表放入HashMap中。

我想让其他尝试访问HashMap的线程等待,直到当前线程完成处理并修改HashMap。

在某些情况下,流程是这样的,

线程A检索HashMap,当线程A正在对HashMap的列表进行处理时,其他线程B检索HashMap并开始处理。

实际行为必须是这样的:
线程A -> 检索HashMap -> 处理 -> 将值放入HashMap。
线程B -> 检索HashMap -> 处理 -> 将值放入HashMap。
线程 C -> 检索 HashMap -> 处理 -> 将值放入 HashMap。

逻辑:

  1. 对 HashMap 应用锁定
  2. 检索。
  3. 进程。
  4. 放入HashMap中。
  5. 释放锁定。

帮助我将逻辑转换为代码,或者任何建议都微笑接受。

最佳答案

你确实可以使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com