import java.util.HashMap;import java.util.Map;import java.util.concurrent.*;public class TestLock { private static ExecutorService executor = Executors.newCachedThreadPool(); private static Map<Integer, Integer> map = new HashMap<>(1000000); private static CountDownLatch doneSignal = new CountDownLatch(1000); public static void main(String[] args) throws Exception { for (int i = 0; i < 1000; i++) { final int j = i; executor.execute(new Runnable() { @Override public void run() { map.put(j, j); doneSignal.countDown(); } }); } doneSignal.await(); System.out.println("done,size:" + map.size()); }}有人說并發時hashmap插入不安全。因為hashmap會進行擴容操作,但是我這里把size設置為1000000,只會擴容到750000。我在這里做了 1000 次插入,所以我不會擴展它。所以應該沒有問題。但是結果總是小于1000,哪里出錯了?
3 回答

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
“因為 hashmap 會執行擴容操作”不僅HashMap
是線程不安全的原因。
您必須參考 Java 內存模型來了解它可以提供什么保證。
這種保證之一是可見性。這意味著除非滿足特定條件,否則在一個線程中所做的更改可能在其他線程中不可見。

青春有我
TA貢獻1784條經驗 獲得超8個贊
那么問題標題并沒有真正描述您的要求。無論如何,
在這里,您已將容量設置為 1000000。不是大小。
容量:最初在這個哈希圖中有多少個插槽?;旧鲜强詹宀邸?/p>
大?。旱貓D中填充的元素數量。
因此,即使您將容量設置為 1000000,最終也沒有那么多元素。所以map中填充的元素個數會通過.size()
方法返回。它與并發問題無關。是的,由于多種原因,HashMap 不是線程安全的。
添加回答
舉報
0/150
提交
取消