Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中Collections.synchronizedMap的基础知识_Java - Fatal编程技术网

java中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

我有一个拥有巨大静态数据结构的类。许多线程可能被并行地读取和访问它。建议我使用Collections.synchronizedMap

私有静态映射>HashSet= Collections.synchronizedMap(新HashMap<字符串, HashSet>())

根据,我需要在访问值时使用synchronized()关键字。我不太理解它

我应该如何修改以下访问:

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);
}
注:不应使用以大写字符开头的变量作为变量名(通用约定)。哈希集->哈希集