我正在开发我的第一个多线程程序,并在同步的几个方面陷入困境。我已经浏览了 oracle/sun 主页上的多线程教程,以及这里的一些关于 SO 的问题,所以我相信我知道什么是同步。然而,正如我提到的,有几个方面我不太确定如何弄清楚。我以明确问题的形式将它们表述如下:
问题一:我有一个单例类,它包含检查有效标识符的方法。事实证明,这个类需要保存集合来跟踪两种不同标识符类型之间的关联。 (如果标识符这个词听起来很复杂;这些只是字符串)。我选择实施两个MultiValueMap http://commons.apache.org/collections/api-release/org/apache/commons/collections/map/MultiValueMap.html实例来实现这种多对多关系。我不确定这些收藏是否have to是线程安全的,因为集合仅在创建单例类的实例时才会更新,但我注意到在文档中它说:
请注意,MultiValueMap 不是同步的,也不是线程安全的。如果您希望同时从多个线程使用此映射,则必须使用适当的同步。当没有同步的并发线程访问该类时,该类可能会抛出异常。
谁能详细说明这种“适当的同步”?它到底是什么意思?我实在无法使用MultiValueMap.decorate()
在同步的HashMap
,或者我误解了什么?
问题2:我有另一个类扩展了HashMap
保存我的实验值,这些值是在软件启动时解析的。此类旨在为我的分析提供适当的方法,例如permutation()
, randomization()
, filtering(criteria)
等等。由于我想尽可能地保护我的数据,因此创建并更新了该类once,并且所有上述方法都返回新集合。再次,我不确定这个类是否需要线程安全,因为它不应该从多个线程更新,但这些方法肯定会从多个线程调用,并且为了“安全”,我添加了synchronized
修改我所有的方法。您能预见到这会出现什么问题吗?我应该注意哪些潜在问题?
Thanks,
答案1:您的单例类不应将其内部使用的集合公开给其他对象。相反,它应该提供适当的方法来公开您想要的行为。例如,如果您的对象有一个Map
其中,没有公共或受保护的方法来返回该值Map
。相反,有一个方法,它接受一个键并返回相应的值Map
(也可以选择设置键的值)。如果需要,可以使这些方法成为线程安全的。
注意,即使对于您不打算写入的集合,我认为您也不应该假设读取必然是线程安全的,除非它们被记录为如此。集合对象可能会维护一些您看不到的内部状态,但可能会在读取时进行修改。
答案2:首先,我认为继承在这里使用不一定是正确的。我会有一个类提供你的方法并且有一个HashMap
作为私人会员。只要您的方法不更改对象或 HashMap 的内部状态,它们就不必同步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)