亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 hashmap 不是線程安全的?

為什么 hashmap 不是線程安全的?

狐的傳說 2021-10-13 16:25:57
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 內存模型來了解它可以提供什么保證。

這種保證之一是可見性。這意味著除非滿足特定條件,否則在一個線程中所做的更改可能在其他線程中不可見。


查看完整回答
反對 回復 2021-10-13
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

那么問題標題并沒有真正描述您的要求。無論如何,

在這里,您已將容量設置為 1000000。不是大小。

容量:最初在這個哈希圖中有多少個插槽?;旧鲜强詹宀邸?/p>

大?。旱貓D中填充的元素數量。

因此,即使您將容量設置為 1000000,最終也沒有那么多元素。所以map中填充的元素個數會通過.size()方法返回。它與并發問題無關。是的,由于多種原因,HashMap 不是線程安全的。


查看完整回答
反對 回復 2021-10-13
  • 3 回答
  • 0 關注
  • 257 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號