JAVA集合类:

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

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

写2个测试类来验证下:

  1. package com.cdfive.learn.thread;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Set;
  7. import java.util.concurrent.ConcurrentHashMap;
  8. /**
  9. * 验证HashSet不是线程安全
  10. *
  11. * @author cdfive
  12. * @date 2019-02-11
  13. */
  14. public class HashSetTest {
  15. public static void main(String[] args) {
  16. final Set<Integer> set = new HashSet<>();// 结果可能大于1000
  17. // final Set<Integer> set = Collections.synchronizedSet(new HashSet<>());// 结果等于1000
  18. // final Set<Integer> set = Collections.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>());// 结果等于1000
  19. // 往set写入1-1000
  20. Runnable runnable = new Runnable() {
  21. @Override
  22. public void run() {
  23. for (int i = 1; i <= 1000; i++) {
  24. set.add(i);
  25. }
  26. }
  27. };
  28. int threadNum = 10;// 线程数
  29. List<Thread> threadList = new ArrayList<>();
  30. for (int i = 0; i < threadNum; i++) {
  31. Thread thread = new Thread(runnable);
  32. threadList.add(thread);
  33. thread.start();
  34. }
  35. // 主线程等待子线程执行完成
  36. for (Thread thread : threadList) {
  37. try {
  38. thread.join();
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. System.out.println(set.size());// 结果可能大于1000
  44. }
  45. }
  1. package com.cdfive.learn.thread;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.concurrent.ConcurrentHashMap;
  8. /**
  9. * 验证HashMap不是线程安全
  10. *
  11. * @author cdfive
  12. * @date 2019-02-11
  13. */
  14. public class HashMapTest {
  15. public static void main(String[] args) {
  16. final Map<Integer, Integer> map = new HashMap<>();// 结果可能大于1000
  17. // final Map<Integer, Integer> map = Collections.synchronizedMap(new HashMap<>());// 结果等于1000
  18. // final Map<Integer, Integer> map = new ConcurrentHashMap<>();// 结果等于1000
  19. // 往map写入1-1000, key和value相同
  20. Runnable runnable = new Runnable() {
  21. @Override
  22. public void run() {
  23. for (int i = 1; i <= 1000; i++) {
  24. map.put(i, i);
  25. }
  26. }
  27. };
  28. int threadNum = 2;// 线程数
  29. List<Thread> threadList = new ArrayList<>();
  30. for (int i = 0; i < threadNum; i++) {
  31. Thread thread = new Thread(runnable);
  32. threadList.add(thread);
  33. thread.start();
  34. }
  35. // 主线程等待子线程执行完成
  36. for (Thread thread : threadList) {
  37. try {
  38. thread.join();
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. System.out.println(map.size());// 结果可能大于1000
  44. }
  45. }

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

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

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

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

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

验证HashSet和HashMap不是线程安全的更多相关文章

  1. HashSet和HashMap的区别

    HashSet和HashMap的区别.Java的HashSet类是由哈希表支持.它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用 null 元素.HashSet类为基本操作提供 ...

  2. HashSet与HashMap的区别

    本文由 ImportNew - 唐小娟 翻译自 Javarevisited.欢迎加入翻译小组.转载请见文末要求. HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到C ...

  3. HashSet、HashMap、Hashtable、TreeMap循环、区别

    HashSet 循环 //可以为null HashSet<Object> hashSet =new HashSet<Object>(); hashSet.add(1); has ...

  4. == 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable

    一:== 和 equals == 比较引用的地址equals 比较引用的内容 (Object 类本身除外) String obj1 = new String("xyz"); Str ...

  5. Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等

    1.Set和Map的关系: Set代表一种集合元素无序.不可重复的集合,Map代表一种由多个key-value对组成的集合. Set的集合继承体系: Map关系集合 Map集合的key特征:所有key ...

  6. Java的HashMap和Hashtable有什么区别HashSet和HashMap有什么区别?使用这些结构保存的数需要重载的方法是哪些?

    HashMap与Hashtable实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用 两者的主要区别如下 1.Hashtable是早期JDK提供的接口,HashMap是新版J ...

  7. HashSet 和 HashMap 的比较

    HashMap 和 HashSet 都是 collection 框架的一部分,它们让我们能够使用对象的集合.collection 框架有自己的接口和实现,主要分为 Set 接口,List 接口和 Qu ...

  8. java数据结构之HashSet和HashMap(java核心卷Ⅰ读书笔记)

    增加 删除 remove方法,可以删除指定的一个元素. 查找 ********************* **************************** HashSet既不可以用 0 1 2 ...

  9. Java HashSet和HashMap源码剖析

    转自: Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...

随机推荐

  1. Android开发之图像处理那点事——滤镜

    在Android开发中,一般对图像的处理就是Bitmap(位图),它包含了图像的全部数据,即点阵和颜色值,点阵就是包含像素点的矩阵,而颜色值就是ARGB,分别代表透明.红色.绿色.蓝色通道,它们共同决 ...

  2. python 将GIF拆分成图片方法

    import os from PIL import Image, ImageSequence def parseGIF(gifname): # 将gif解析为图片 # 读取GIF im = Image ...

  3. 预处理、编译、汇编、链接、启动代码、相关command

    被忽略的过程 对于C这种编译性语言,我们平时编译时,不管是通过IDE图形界面,还是通过命令行,总感觉编译一下就完成了,然后就得到了针对某OS和某CPU的二进制可执行文件(机器指令的文件).但是实际上在 ...

  4. PP 各种快捷键

    内容识别 Shitf + F5 (留白填充) 内容识别比例 Alt + Shift +Ctrl +C 取消选区 Ctrl + D Alpha通道 左击 + Ctrl 锐化 先换成Lab颜色 在无颜色的 ...

  5. jade安全转义和非转义

      - var data = 'text' - var htmlData = ')</script><span>script</span>' 例如上面的例子,假如没 ...

  6. 2.caffe初解

    http://www.cnblogs.com/nwpuxuezha/p/4302024.html 原文链接:caffe.berkeleyvision.org/tutorial/layers.html ...

  7. 谷歌,火狐提示来自"http://xxx.com/file"的资源已被阻止,因为 MIME 类型("text/plain")不匹配(X-Content-Type-Options: nosniff),如何解决?

    在使用ueditor编辑的过程中无法上传图片,谷歌火狐浏览器提示Cross-Origin Read Blocking (CORB) blocked cross-origin response http ...

  8. TODO 疑问:java中的工厂类,在实际项目中如何运用

    正在读core of java,工厂类一直没搞懂.感觉和静态方法相类似,但是不知道是怎么运用在实际中. 20190711: 读了设计模式,里面给出的解读是这样的 Define an interface ...

  9. onbeforeunload、onpagehide、onunload、onload、onpageshow的正确执行顺序

    一.Chrome支持onbeforeunload.onpagehide.onunload,只是在这些方法执行的时候alert,console这些方法已经被注销了. 二.浏览器跳转.关闭.刷新时都按a, ...

  10. 4、获取Class中的构造函数

    4.获取Class中的构造函数 4.1 早期创建对象 早期创建对象,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,并创建该字节码文件对象,并接着创建该接文件的对应的Person对象 co ...