相关疑难解决方法(0)

对于不同的密钥,HashMap是否是线程安全的?

如果我有两个多线程访问HashMap,但保证他们永远不会同时访问同一个密钥,那还能导致竞争条件吗?

java multithreading hashmap thread-safety

80
推荐指数
4
解决办法
5万
查看次数

为什么 hashmap 不是线程安全的?

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

有人说并发时hashmap插入不安全。因为hashmap会进行扩容操作,但是我这里把size设置为1000000,只会扩容到750000。我在这里做了 1000 次插入,所以我不会扩展它。所以应该没有问题。但是结果总是小于1000,哪里出错了?

java

0
推荐指数
1
解决办法
1777
查看次数

标签 统计

java ×2

hashmap ×1

multithreading ×1

thread-safety ×1