【发布时间】:2018-09-05 13:09:04
【问题描述】:
我有以下方法:
private static HashSet<Integer> ids = new HashSet<>();
public static void someMethod(SomeObject o) {
// some code
ids.add(o.getId());
if(ids.size() > 10) {
// do something
}
else {
// do something else
}
}
使这个方法线程安全的一个简单方法是添加关键字synchronized。
我想知道是否已经有一些更合适的方法可以在地图/集合中添加项目并自动检查大小
【问题讨论】:
-
不知道除了使用
synchronized关键字之外的任何其他可能性。使用有什么问题吗? -
@AnarchoEnte:我只是想知道是否还有其他方法可以通过
ConcurrentHashMap和类似方法 -
在这篇文章之后,由于
ids.size()调用,您无法使用ConcurrentHashMap来实现上述代码的全线程安全。 stackoverflow.com/questions/25998536/… -
ConcurrentHashMap不是解决方案,它将返回大小的估计值。但是,如果您在此处同步整个方法,您将做的不仅仅是在地图/集合中添加一个项目并自动检查大小,您还可以执行do something或do something else- 你明白吗? -
@Eugene:是的,但是这些部分对性能的影响很小。我想知道是否有一种惯用的 java 方式来解决这个问题
标签: java multithreading concurrency thread-safety hashset