gpt4 book ai didi

java - 关于java同步的问题;何时/如何/到何种程度

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:55:46 24 4
gpt4 key购买 nike

我正在开发我的第一个多线程程序,但在同步的几个方面遇到了困难。我已经阅读了 oracle/sun 主页上的多线程教程,以及此处关于 SO 的一些问题,所以我相信我对同步是什么有所了解。然而,正如我提到的,有几个方面我不太确定如何弄清楚。我以明确的问题形式将它们表述如下:

问题 1: 我有一个单例类,其中包含检查有效标识符的方法。事实证明,此类需要保留集合以跟踪 2 种不同标识符类型之间的关联。 (如果单词标识符听起来很复杂;这些只是字符串)。我选择实现两个 MultiValueMap实例来实现这种多对多关系。我不确定这些集合是否必须是线程安全的,因为集合只会在创建单例类实例时更新,但我注意到在文档中它说:

Note that MultiValueMap is not synchronized and is not thread-safe. If you wish to use this map from multiple threads concurrently, you must use appropriate synchronization. This class may throw exceptions when accessed by concurrent threads without synchronization.

谁能详细说明这种“适当的同步”?这到底是什么意思?我真的不能在同步的 HashMap 上使用 MultiValueMap.decorate(),还是我误解了什么?

问题 2: 我有另一个扩展 HashMap 的类来保存我的实验值,这些值在软件启动时被解析。此类旨在为我的分析提供适当的方法,例如 permutation()randomization()filtering(criteria) 等。由于我想尽可能地保护我的数据,创建和更新该类一次,并且上述所有方法都返回新集合。同样,我不确定这个类是否需要线程安全,因为它不应该从多个线程更新,但是这些方法肯定会从多个线程调用,并且是“安全的”我已经添加我所有方法的 synchronized 修饰符。你能预见到任何问题吗?我应该注意哪些潜在问题?

谢谢,

最佳答案

答案 1:您的单例类不应将其在内部使用的集合公开给其他对象。相反,它应该提供适当的方法来公开您想要的行为。例如,如果您的对象中有一个 Map,则没有公共(public)或 protected 方法来返回该 Map。取而代之的是有一个方法,它接受一个键并返回 Map 中的相应值(以及可选的设置键值的方法)。如果需要,这些方法可以成为线程安全的。

注意,即使对于您不打算写入的集合,我也不认为您应该假设读取必然是线程安全的,除非它们被记录为如此。集合对象可能会维护一些您看不到的内部状态,但可能会在读取时被修改。

答案 2: 首先,我认为在这里使用继承不一定是正确的。我会有一个提供您的方法的类,并将 HashMap 作为私有(private)成员。只要您的方法不更改对象或 HashMap 的内部状态,它们就不必同步。

关于java - 关于java同步的问题;何时/如何/到何种程度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com