JAVA集合类:

java.util包下的HashSet和HashMap类不是线程安全的,

java.util.concurrent包下的ConcurrentHashMap类是线程安全的。

写2个测试类来验证下:

package com.cdfive.learn.thread;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; /**
* 验证HashSet不是线程安全
*
* @author cdfive
* @date 2019-02-11
*/
public class HashSetTest {
public static void main(String[] args) {
final Set<Integer> set = new HashSet<>();// 结果可能大于1000
// final Set<Integer> set = Collections.synchronizedSet(new HashSet<>());// 结果等于1000
// final Set<Integer> set = Collections.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>());// 结果等于1000 // 往set写入1-1000
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 1000; i++) {
set.add(i);
}
}
}; int threadNum = 10;// 线程数
List<Thread> threadList = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
Thread thread = new Thread(runnable);
threadList.add(thread);
thread.start();
} // 主线程等待子线程执行完成
for (Thread thread : threadList) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
} System.out.println(set.size());// 结果可能大于1000
}
}
package com.cdfive.learn.thread;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
* 验证HashMap不是线程安全
*
* @author cdfive
* @date 2019-02-11
*/
public class HashMapTest {
public static void main(String[] args) {
final Map<Integer, Integer> map = new HashMap<>();// 结果可能大于1000
// final Map<Integer, Integer> map = Collections.synchronizedMap(new HashMap<>());// 结果等于1000
// final Map<Integer, Integer> map = new ConcurrentHashMap<>();// 结果等于1000 // 往map写入1-1000, key和value相同
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 1000; i++) {
map.put(i, i);
}
}
}; int threadNum = 2;// 线程数
List<Thread> threadList = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
Thread thread = new Thread(runnable);
threadList.add(thread);
thread.start();
} // 主线程等待子线程执行完成
for (Thread thread : threadList) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
} System.out.println(map.size());// 结果可能大于1000
}
}

如果需要保证线程安全的场景:

1.将HashSet或HashMap转换为线程安全,使用Collections.synchronizedSet或Collections.synchronizedMap方法;

2.使用Collections.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>())或使用java.util.concurrent包下的ConcurrentHashMap;

3.仍然使用HashSet或HashMap,使用时手动进行加锁或同步;// 注意加锁粒度,尽可能保证性能

在项目中根据实际场景进行选择和应用。

最新文章

  1. Spring IoC源码解析——Bean的创建和初始化
  2. 音乐播放器 EasyMusic (一)
  3. CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
  4. Linux1:Linux概述
  5. Flip Game(dfs)
  6. 使用 Override 和 New 关键字进行版本控制
  7. 使用Aspose.Words把 word转成图片
  8. nginx跳转
  9. LockSupport浅析
  10. 从零开始学 Web 系列教程
  11. 用户认证--------------auth模块
  12. python的sys.args使用
  13. kettle实现sqlserver与mysql的连接并写入mysql
  14. CM和CDH的安装-准备工作
  15. Mysql delete操作
  16. 使用 Jenkins 和 Team Services 将应用部署到 Linux VM
  17. 使用Spring MVC统一异常处理实战&lt;转&gt;
  18. [fastjson] - fastjson中 JSONObject 和 JSONArray
  19. SVN部署
  20. Centos7安装和配置Jira7.3.6

热门文章

  1. linux环境下composer的安装与使用
  2. 切换composer国内镜像 Laravel China停用,切换阿里云composer全量镜像
  3. vSphere
  4. 如何利用while语句根据用户输入要求打印菱形图案
  5. ubuntu---github下载太慢的解决办法
  6. ZZNUOJ-2157: 水滴来袭-【干扰阅读-卡模糊精度1e-8的问题】
  7. js 获取扫码枪信息
  8. vimrc config and NERDTree
  9. VSCode 的PHP常用插件及安装
  10. informix创建同义词