gpt4 book ai didi

java - 使用多线程时如何深度复制 HashMap

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:29 24 4
gpt4 key购买 nike

在我的应用程序中,我有两个线程。线程 1 正在向线程 2 传输数据。传输数据后,线程 1 中的数据在线程 2 中被清除。线程 1 继续其快乐的方式,将更多数据放入 HashMap 中,因为它稍后会传输到线程 2。同时,线程 2 对数据执行它需要执行的操作。我下面的代码是线程 2 中发生线程间数据传输的部分。整个应用程序工作正常,但我的问题是,是否有更好的方法来为线程 2 制作线程 1 数据的副本,而无需使用关键字 new 创建一个全新的对象?

我认为这样做可能会导致发生更多的垃圾回收?我不应该担心这个吗?

synchronized(this){
// Make a copy of the data map then clear it.
cachedData = new HashMap<String,ArrayList<Float>>(data);
data.clear();
}

最佳答案

因此,如果您从多个线程访问此数据 HashMap,那么您必须在每个< 访问。仅仅因为您在此处获取缓存副本并不意味着其他线程可以在没有同步的情况下使用 data

如果您想并发使用 HashMap 而不必在每次使用时同步,那么您应该使用 ConcurrentHashMap

The entire application works just fine, but my questions is, is there a better way to make this copy of the thread 1 data for thread 2 without using the keyword new to create a whole new object?

考虑到我上面提到的注意事项,如果您想拍摄 HashMap 的快照,以便您可以在特定线程中处理内容,那么您提到的模式很好并且通常是用过的。当您需要遍历 Collection 并在循环内修改它而不执行 iterator.remove() 时,也会使用此模式。

如果您只需要键或值,请确保复制 data.keySet()data.values()

关于java - 使用多线程时如何深度复制 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10455000/

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