gpt4 book ai didi

java - 线程安全映射 : improve performance

转载 作者:行者123 更新时间:2023-11-29 03:18:56 27 4
gpt4 key购买 nike

public class EntityUtils
{
private static final Map<String, Map<String, String>> searchMap = new HashMap<>();

private static Map<String, String> getSearchablePathMap(String key)
{
synchronized(searchMap)
{
Map<String, String> pathMap = searchMap.get(key);
if(pathMap != null) return pathMap;

pathMap = new HashMap<>();
pathMap.put(..., ...);
...
// heavy map population operations
...

pathMap = Collections.unmodifiableMap(pathMap);

searchMap.put(key, pathMap);
}

return pathMap;
}
}

map 条目永远不会被删除。

由于人口众多,无法使用 ConcurrentHashMap.putIfAbsent()

key 已经存在时,您能否建议性能改进以避免同步?

最佳答案

无法避免 get 上的某种级别的同步,但可以允许并发读取。考虑使用 ReadWriteLock保护对您的搜索 map 的访问。这仅适用于获取远多于放置的情况。

public class EntityUtils
{
private static final ReadWriteLock RW_LOCK = new ReentrantReadWriteLock();
private static final Map<String, Map<String, String>> searchMap = new HashMap<>();

private static Map<String, String> getSearchablePathMap(String key)
{
RW_LOCK.readLock().lock();
try
{
Map<String, String> pathMap = searchMap.get(key);
if(pathMap != null) return pathMap;
}
finally
{
RW_LOCK.readLock().unlock();
}

RW_LOCK.writeLock().lock();
try
{
//first check to see if a previous holder of write lock built map for us
Map<String, String> pathMap = searchMap.get(key);
if(pathMap != null) return pathMap;

pathMap = new HashMap<>();
pathMap.put(..., ...);
...
// heavy map population operations
...

pathMap = Collections.unmodifiableMap(pathMap);

searchMap.put(key, pathMap);
}
finally
{
RW_LOCK.writeLock().unlock();
}

return pathMap;
}
}

关于java - 线程安全映射 : improve performance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24842180/

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