java中Collections.synchronizedMap的基础知识
我有一个拥有巨大静态数据结构的类。许多线程可能被并行地读取和访问它。建议我使用Collections.synchronizedMap 私有静态映射java中Collections.synchronizedMap的基础知识,java,Java,我有一个拥有巨大静态数据结构的类。许多线程可能被并行地读取和访问它。建议我使用Collections.synchronizedMap 私有静态映射HashSet= Collections.synchronizedMap(新HashMap()) 根据,我需要在访问值时使用synchronized()关键字。我不太理解它 我应该如何修改以下访问: if (HashSets.get (lang).contains (st)) if (HashSets.containsKey (lang) == fa
if (HashSets.get (lang).contains (st))
if (HashSets.containsKey (lang) == false)
HashSets.put (lang, testhashset);
任何详细解释的链接都应该是有用的
谢谢,如果您想保护所有的小地图,那么您需要在操作它们时锁定大地图(或其他方便的全局可访问对象)。只要访问大地图本身的单个方法调用就可以了,因为它是同步的。但第一个电话必须是
synchronized(HashSets) {
if (HashSets.get(lang).contains(st)) ...
}
您还需要在迭代任何映射的键时锁定大映射,否则您将面临ConcurrentModificationException
s的风险
正如另一张海报所指出的,这不是一个很好的设计。即使您让它工作,性能也会很差,因为单个大锁将大大降低并发性。持有little
ConcurrentHashMap
s的ConcurrentHashMap
s会是一个更好的主意。如果您想保护所有的小地图,那么您需要在操作它们时锁定大地图(或其他方便的全局可访问对象)。只要访问大地图本身的单个方法调用就可以了,因为它是同步的。但第一个电话必须是
synchronized(HashSets) {
if (HashSets.get(lang).contains(st)) ...
}
您还需要在迭代任何映射的键时锁定大映射,否则您将面临ConcurrentModificationException
s的风险
正如另一张海报所指出的,这不是一个很好的设计。即使您让它工作,性能也会很差,因为单个大锁将大大降低并发性。一个
ConcurrentHashMap
持有很少的ConcurrentHashMap
s将是一个更好的主意。规范页面试图说的是,当您需要对返回的映射进行相互依赖的多个访问时(例如迭代),您必须进行同步。但是单独立线程是线程安全和原子的
因此,在您的情况下,因为您只想在IF操作中的条件适用时执行put,所以您应该将整个过程包装在synchronized{}
中,如下所示:
synchronized(HashSets ){
if (HashSets.get (lang).contains (st))
if (HashSets.containsKey (lang) == false)
HashSets.put (lang, testhashset);
}
注:不应使用以大写字符开头的变量作为变量名(通用约定)。HashSets->HashSets规范页面试图说明的是,当您需要对返回的映射进行相互依赖的多次访问(例如迭代)时,必须进行同步。但是单独立线程是线程安全和原子的 因此,在您的情况下,因为您只想在IF操作中的条件适用时执行put,所以您应该将整个过程包装在
synchronized{}
中,如下所示:
synchronized(HashSets ){
if (HashSets.get (lang).contains (st))
if (HashSets.containsKey (lang) == false)
HashSets.put (lang, testhashset);
}
注:不应使用以大写字符开头的变量作为变量名(通用约定)。哈希集->哈希集