狐的傳說(shuō)
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()); }}有人說(shuō)并發(fā)時(shí)hashmap插入不安全。因?yàn)閔ashmap會(huì)進(jìn)行擴(kuò)容操作,但是我這里把size設(shè)置為1000000,只會(huì)擴(kuò)容到750000。我在這里做了 1000 次插入,所以我不會(huì)擴(kuò)展它。所以應(yīng)該沒(méi)有問(wèn)題。但是結(jié)果總是小于1000,哪里出錯(cuò)了?
3 回答

ABOUTYOU
TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
“因?yàn)?hashmap 會(huì)執(zhí)行擴(kuò)容操作”不僅HashMap
是線程不安全的原因。
您必須參考 Java 內(nèi)存模型來(lái)了解它可以提供什么保證。
這種保證之一是可見(jiàn)性。這意味著除非滿足特定條件,否則在一個(gè)線程中所做的更改可能在其他線程中不可見(jiàn)。

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