HashMap 1.8的源码分析三
2024-08-28 21:36:38
线程安全问题:
在添加时候并没有进行安全考虑,枷锁
所以是线程不安全的,接下来进行代码测试;
package com.mmall.concurrency.example.commonUnsafe; import com.mmall.concurrency.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j; import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; public class HashMapExample { // 请求总数
public static int clientTotal = ; // 同时并发执行的线程数
public static int threadTotal = ; private static Map<Integer, Integer> map = new HashMap<>(); public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for (int i = ; i < clientTotal; i++) {
final int count = i;
executorService.execute(() -> {
try {
semaphore.acquire();
update(count);
semaphore.release();
} catch (Exception e) {
log.error("exception" , e);
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
System.out.println(map.size());
log.info("size:{}" , map.size());
} private static void update(int i) {
map.put(i, i);
}
}
运行三次:
所以hashmap是线程不安全的,那么我们在代码里面怎么还要用呢,我们只是局部使用,并没有在多线程环境下使用,所以并不会出现线程安全问题
最新文章
- Jmeter响应内容为文件
- linux 命令行中常用光标移动快捷键
- subprocess模块在Windows下调用失败问题
- 用Ogre实现《天龙八部》场景中水面(TerrainLiquid)详解
- Android——复选按钮和开关按钮
- ls 知识点
- &#39;mysql&#39; 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法
- 锋利的jquery-validation
- ajaxPro用法
- git add相关
- jdom.jar导入问题
- Sass实战 sass官网
- 【JAVAWEB学习笔记】25_基础加强:类加载器、注解 @xxx和动态代理
- 集群通信组件Tribes之整体介绍
- C#开发微信支付之企业向用户付款
- Javascript async异步操作库简介
- CrackME 2011 # 2 逆向练习解题思路
- 容器内部设置JVM的Heap大小
- 常用 对象检测 api
- 字符串 dfs