我有一个提供程序类,它将我的对象与字符串相关联;简而言之,我的提供程序包装了 a (比方说 Map<String, Object>
)并具有以下 3 个操作:
-
Object get(String key)
:由多个线程大规模运行 -
void add(String key, Object obj)
:由单线程运行 -
void remove(String key)
:由与add
相同的单线程运行
而get()
操作需要快速且可扩展,add()
和remove()
操作对性能要求不强
我想避免使用 ConcurrentHashMap
因为它肯定会导致可扩展性问题
所以我的想法是包装一个HashMap
并执行以下操作:
- 我的
get()
操作执行HashMap.get()
- 我的
add()
手术- 复制原件
HashMap
- 将新元素添加到复制的
HashMap
中 - 做以下做作
originalHashMap = copiedHashMap
- 复制原件
- 我的
remove()
操作(几乎相同)- 复制原件
HashMap
- 从复制的
HashMap
中删除所需的元素 - 做以下做作
originalHashMap = copiedHashMap
- 复制原件
在我看来,这种做法是完全可扩展的。你觉得怎么样?
我认为为了我的发展,我需要包装我的 Map
AtomicReference<>
中的属性: 你对此有何看法?
感谢您的帮助
最佳答案
我在这里很困惑。您说您想避免可扩展性问题,您的解决方案是在每个写入命令上复制整个 map ?
您可能知道也可能不知道这一点,但这本质上就是 ConcurrentHashMap 在幕后所做的事情。只是它以这样的方式执行此操作:仅对正在写入的映射的一小部分执行此操作,并且仅在绝对必要时才执行复制。它是由业内一些最聪明的人编写的,并且已经在实验室和野外进行了广泛的测试。
因此,为什么不直接使用 ConcurrentHashMap 呢?
说真的,这是一个已解决的问题, friend 。
关于java - 出于可扩展性目的,不使用 ConcurrentHashMap 并发访问 Java Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48196053/