我对线程安全和HashMaps有疑问。更具体地说,我想知道一个线程是否有可能在写入时从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写入时,get()方法是否有可能尝试复制testHashMap?如果是这样,在这个例子中如何确保线程安全?我是否必须创建synchronizedMap而不是HashMap?
提前致谢。
答案 0 :(得分:1)
get()方法是否有可能在TestThread写入时试图复制testHashMap?
没有。 get()
方法只返回地图。没有复制在这里。
但是,是的,你必须以某种方式控制对地图的访问,因为HashMap
不是线程安全的。您可以通过同步散列映射(Map<A, B> map = Collections.synchronizedMap(new HashMap<A, B>());
)或使用ConcurrentHashMap
来实现此目的。