一个HashMap,两个线程 - 在这个例子中我如何确保线程安全?

时间:2017-07-30 13:08:28

标签: java hashmap thread-safety

我对线程安全和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?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

get()方法是否有可能在TestThread写入时试图复制testHashMap?

没有。 get()方法只返回地图。没有复制在这里。

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