package com.cxy;

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; /**
* Created by Administrator on 2019/4/10.
*/
public class CxyDemo {
// 请求总数
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不是一个线程安全的类,上面就是对其进行测试

执行结果:

再执行一次:

可见不是线程安全的,

package com.cxy;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.*; /**
* Created by Administrator on 2019/4/10.
*/
public class CxyDemo {
// 请求总数
public static int clientTotal = ; // 同时并发执行的线程数
public static int threadTotal = ; //private static Map<Integer, Integer> map = new HashMap<>();
private static ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>(); 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);
} }

测试concurrentHashmap,可以知道是线程安全的

package com.cxy;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.*; /**
* Created by Administrator on 2019/4/10.
*/
public class CxyDemo {
// 请求总数
public static int clientTotal = ; // 同时并发执行的线程数
public static int threadTotal = ; //private static Map<Integer, Integer> map = new HashMap<>();
// private static ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
private static Map<Integer, Integer> map = new Hashtable<>(); 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);
} }

hashtable也是线程安全:

总结:通过semaphore来模拟线程数,然后通过countdownlatch线程计数器来计算执行的线程,这样可以来模拟高并发测试

最新文章

  1. PPPoE(以太网上的点对点协议)
  2. YII2的增删改查
  3. 拓展Yii Framework(易框架)
  4. Ubuntu 下配置Ganglia监控
  5. linux下打开chm文件的方法
  6. centos 用户切换
  7. Tea加密算法和XxTea加密算法
  8. 老李分享:持续集成学好jenkins之Git和Maven配置 2
  9. canvas画布标签
  10. 从 python 中 axis 参数直觉解释 到 CNN 中 BatchNorm 的工作方式(Keras代码示意)
  11. 洛谷P1083借教室题解
  12. WPF版公司的自动签到程序
  13. AnswerOpenCV一周佳作欣赏(0615-0622)
  14. Oracle PL/SQL游标
  15. Oracle高级查询之OVER
  16. PAT甲题题解-1112. Stucked Keyboard (20)-(map应用)
  17. 【IL】IL指令详解
  18. Docker Compose 入门使用指南
  19. [javaSE] 标识符大小写
  20. 使GDAL库支持中文路径或中文文件名的处理方法

热门文章

  1. 将.sql文件导入powerdesigner的实现方法详解
  2. POJ 3169 C - Layout
  3. 【bzoj1019】[SHOI2008]汉诺塔
  4. web优化
  5. 在Windows 8上安装SQL Server2012
  6. ifcfg-eth0文件参数PREFIX 和 NETMASK的配置不一致问题
  7. JavaScript——Dom编程(1)
  8. ssh试卷
  9. 黑盒测试实践--Day3 11.27
  10. sql多表链接之三表连接查询