【发布时间】:2018-09-27 05:47:16
【问题描述】:
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会进行扩容操作,但是我这里设置大小为1000000,只会扩容到750000。我在这里做了 1000 次插入,所以我不会扩展它。所以应该没有问题。但是结果总是小于1000,怎么回事?
【问题讨论】:
-
线程安全问题不仅限于展开操作。任何修改操作都可能导致竞争条件、可见性问题、原子性问题。
-
为了说明,这个在每次放置时执行的简单操作不是线程安全的:
++size。 -
不,不是“某些人”说
HashMap不是线程安全的,而是the documentation。提示:如果一个类没有在其文档中明确承诺线程安全,请始终假定它是不是线程安全的。
标签: java