ConcurrentHashMap中的Thread Safe get方法

时间:2016-08-16 14:47:58

标签: java multithreading concurrenthashmap

据我所知,Concurrent HashMap一次只允许一个线程更新/写入"每个段"。但是,允许多个线程同时从地图读取值。
对于我的项目,我想扩展此功能,以便在从特定段获取值时,在读取完成之前,不应在该段中进行更新/写入操作。

实现这一目标的任何想法?

3 个答案:

答案 0 :(得分:1)

  

只是详细说明我现在面临的问题。在从地图读取值之后,我执行某些强烈依赖于该读取值的更新操作。因此,如果一个单独的线程更新一个键值而另一个线程get()无法获得最近更新的值,这将导致一个大混乱。那么在这种情况下,扩展会是一个好主意吗?

我的直觉说没有。扩展ConcurrentHashMap听起来不是一个好主意。

您可以遵守的最有价值的设计原则之一称为"关注点分离。"主要关注" HashMap的一个用途是存储键/值对。听起来像保持程序中某些数据之间的一致关系是另一个问题。

请勿尝试用单一课程解决这两个问题。我会创建一个更高级的类来处理维护一致的关系(可能使用Lock个对象),我会使用普通的HashMapConcurrentHashMap来存储密钥/价值对。

答案 1 :(得分:0)

扩展ConcurrentHashMap类,并通过包含 synchronized 块来实现 getValue()方法,以便在读取操作完成之前不允许其他线程访问

答案 2 :(得分:0)

非正式地,您可以将Map视为一组“变量”,每个“变量”由一个键(而不是普通变量的静态名称)来寻址。

(数组正式是变量列表,每个变量都由整数索引处理。)

在HashMap中,这些“变量”就像“普通”变量;如果同时访问“变量”,事情可能会出错(就像普通的非易失性变量一样)

在ConcurrentHashMap中,这些“变量”具有volatile语义。因此,同时使用它“更安全”。例如,写入将对“后续”读取可见。

当然,有时volatile是不够的;例如,我们知道我们不能将volatile int用于原子增量(没有锁定)。我们需要像AtomicInteger这样的新设备进行原子操作。

幸运的是,在Java 8中,新的原子方法被添加到ConcurrentHashMap中,所以现在我们可以原子地对这些“变量”进行操作。查看compute()方法是否适合您的使用案例。