![]() |
1
4
没有一种方法可以完全按照你想要的方式去做-- ConcurrentHashMap java.util.Map.computeIfAbsent 功能。 下面是一个代码示例,它与您提供的样式相同,应该可以帮助您继续。
|
![]() |
2
3
我不确定你能做你想做的事。但是,您可以批处理一些更新,或者将检查与枚举/添加分开进行。
如果大多数搜索命中,那么我们主要需要地图上的读取吞吐量。 一个writer线程就足够了。 因此,与直接添加到主映射不同,并发读卡器可以检查它们的输入,如果不存在,则将它们添加到要枚举并添加到主ConcurrentHashMap的队列中。 那么您就不需要原子计数器,或者当两个线程看到相同的字符串时,在将其添加到映射之前将计数器递增两次也没有任何问题(否则这是个大问题。)
如果一个作家有办法锁定
为了减少主前端线程之间的争用,可以有多个队列,比如每个线程可能有一个生产者/消费者队列,或者一对物理内核上运行的一组4个线程共享一个队列。
在读写器不争用的队列中,枚举线程没有争用。但是多个队列减少了写入程序之间的争用(写入这些队列的线程是以只读方式访问主ConcurrentHashMap的线程,如果命中率很高,则大部分CPU时间将花在这里。) 某种程度上 read-copy-update (RCU) 数据结构可能是好的,如果Java有这个功能的话 在90%的命中率下,一个writer线程可能可以跟上10个左右的reader线程,这些线程根据主表过滤新的键。 您可能需要设置一些队列大小限制,以允许来自单个writer线程的背压。或者,如果您拥有的内核/线程比单个编写器所能跟上的还要多,那么某种并发设置可能会有帮助,让多个线程在编号之前消除重复。
我想也许试着在比赛条件下找出错误的地方,然后再回去解决问题,但这可能不是更好的办法。 |