我对Java中的线程很陌生,我需要从几个活动线程访问数据结构。我听说java.util.concurrent.ConcurrentHashMap是线程友好的。我是否需要在访问synchronized(map){}时使用ConcurrentHashMap,还是它将自己处理锁?
发布于 2012-08-30 09:41:11
它自己处理锁,实际上您无法访问它们(没有其他选项)。
您可以在特殊情况下使用synchronized进行写操作,但是很少需要这样做。例如,如果您需要实现自己的putIfAbsent,因为创建对象的成本很高。
对读取使用同步化将无法实现使用并发集合的目的。
发布于 2012-08-30 09:54:35
ConcurrentHashMap只适用于不需要任何原子性而不需要开箱即用的情况。例如,如果您需要获得一个值,使用它做一些事情,然后设置一个新值,所有这些都是在原子操作中,如果没有外部锁定,这是不可能实现的。
在所有这些情况下,没有什么可以替换代码中的显式锁,使用这个实现而不是使用基本的HashMap只是浪费。
发布于 2012-08-30 09:41:28
简短的回答:不,你不需要使用synchronized(map)。
较长的答覆:
ConcurrentHashMap提供的所有操作都是线程安全的,您可以调用它们而不必担心锁定。https://stackoverflow.com/questions/12194001
复制相似问题