据我所知,Concurrent HashMap一次只允许一个线程更新/写入"每个段"。但是,允许多个线程同时从地图读取值。
对于我的项目,我想扩展此功能,以便在从特定段获取值时,在读取完成之前,不应在该段中进行更新/写入操作。
实现这一目标的任何想法?
答案 0 :(得分:1)
只是详细说明我现在面临的问题。在从地图读取值之后,我执行某些强烈依赖于该读取值的更新操作。因此,如果一个单独的线程更新一个键值而另一个线程get()无法获得最近更新的值,这将导致一个大混乱。那么在这种情况下,扩展会是一个好主意吗?
我的直觉说没有。扩展ConcurrentHashMap
听起来不是一个好主意。
您可以遵守的最有价值的设计原则之一称为"关注点分离。"主要关注" HashMap的一个用途是存储键/值对。听起来像保持程序中某些数据之间的一致关系是另一个问题。
请勿尝试用单一课程解决这两个问题。我会创建一个更高级的类来处理维护一致的关系(可能使用Lock
个对象),我会使用普通的HashMap
或ConcurrentHashMap
来存储密钥/价值对。
答案 1 :(得分:0)
扩展ConcurrentHashMap类,并通过包含 synchronized 块来实现 getValue()方法,以便在读取操作完成之前不允许其他线程访问
答案 2 :(得分:0)
非正式地,您可以将Map视为一组“变量”,每个“变量”由一个键(而不是普通变量的静态名称)来寻址。
(数组正式是变量列表,每个变量都由整数索引处理。)
在HashMap中,这些“变量”就像“普通”变量;如果同时访问“变量”,事情可能会出错(就像普通的非易失性变量一样)
在ConcurrentHashMap中,这些“变量”具有volatile
语义。因此,同时使用它“更安全”。例如,写入将对“后续”读取可见。
当然,有时volatile
是不够的;例如,我们知道我们不能将volatile int用于原子增量(没有锁定)。我们需要像AtomicInteger这样的新设备进行原子操作。
幸运的是,在Java 8中,新的原子方法被添加到ConcurrentHashMap中,所以现在我们可以原子地对这些“变量”进行操作。查看compute()
方法是否适合您的使用案例。