java - 下面类的线程安全是否会被破坏?我确信不可能,但只是想双重确定,因为它不容易测试

标签 java multithreading concurrency hashset

public class ThreadSafe implements ITaskCompletionListener {

private final Set<String> taskIds = new HashSet<String>();
private final Set<String> successfulIds = new HashSet<String>();
private final Set<String> cancelledIds = new HashSet<String>();
private final Set<String> errorIds = new HashSet<String>();

public ThreadSafe() {

}

// invoked concurrently
@Override
public void onCancel(String pTaskId) {
    remove(pTaskId);
    cancelledIds.add(pTaskId);
}

// invoked concurrently
@Override
public void onError(String pTaskId) {
    remove(pTaskId);
    errorIds.add(pTaskId);
}

// invoked concurrently
@Override
public void onSuccess(String pTaskId) {
    remove(pTaskId);
    successfulIds.add(pTaskId);
}

private void remove(String pTaskId) {
    taskIds.remove(pTaskId);
}

}

最佳答案

来自HashSet文档:

Note that this implementation is not synchronized. If multiple threads access a hash set concurrently, and at least one of the threads modifies the set, it must be synchronized externally

所以不,你的代码不是线程安全的。并发访问任何方法都可能会产生奇怪的结果。

关于java - 下面类的线程安全是否会被破坏?我确信不可能,但只是想双重确定,因为它不容易测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270544/

相关文章:

Java注册简单检查器

java - j2me - 随机数 - 纸牌游戏

python - 使用 Twisted 和 PB 等待事件

java - 基本 Java 线程(4 个线程)比非线程慢

ruby - 测试并发特性

java - 处理 myBatis 嵌套 SQLException

java - 在每个第 n 个字符处拆分一个字符串

c++ - 如何将矩阵提升为具有多个线程的幂?

c++ - 带有 std::thread 和 this 的 ctor 初始值设定项列表

c# - 如何实现以 ConcurrentDictionary 为条件的 TryRemove?