gpt4 book ai didi

java - 一个HashMap,两个线程——在这个例子中如何保证线程安全?

转载 作者:行者123 更新时间:2023-12-02 12:28:06 27 4
gpt4 key购买 nike

我有一个关于线程安全和 HashMap 的问题。更具体地说,我想知道一个线程是否有可能在写入 HashMap 时尝试读取它。这是一个粗略的示例:

我有一个名为“TestClass”的类:

public class TestClass implements Runnable {

// New thread
TestThread testThread = new TestThread();

@Override
public void run() {

// Starts the thread.
testThread.start();

// A copy of testHashMap is retrieved from the other thread.
// This class often reads from the HashMap.
// It's the only class that reads from the HashMap.
while (true) {
HashMap<String, Long> testHashMap = testThread.get();

}
}
}

我还有另一个名为 TestThread 的类:

public class TestThread extends Thread {

private HashMap<String, Long> testHashMap = new HashMap<>();

@Override
public void run() {

// This thread performs a series of calculations once a second.
// After the calculations are done, they're saved to testHashMap with put().
// This is the only thread that writes to testHashMap.

}

// This method returns a copy of testHashMap. This method is used by the Test class.
public HashMap<String, Long> get() {
return testHashMap;
}

}

当 TestThread 写入 testHashMap 时,get() 方法是否可能会尝试复制 testHashMap?如果是这样,我如何确保本例中的线程安全?我必须创建一个synchronizedMap而不是HashMap吗?

提前致谢。

最佳答案

Is it possible that the get() method will attempt to copy testHashMap while it's being written to by TestThread?

没有。 get()方法只返回 map 。这里没有复制。

但是,是的,您必须以某种方式控制对 map 的访问,因为 HashMap不是线程安全的。您可以通过同步 HashMap ( Map<A, B> map = Collections.synchronizedMap(new HashMap<A, B>()); ) 或使用 ConcurrentHashMap 来实现此目的.

关于java - 一个HashMap,两个线程——在这个例子中如何保证线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45400158/

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