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,使用时手动进行加锁或同步;// 注意加锁粒度,尽可能保证性能

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

验证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. 自定义flask转换器

    自定义flask转换器 以匹配手机号为例: # 1. 定义自己的转换器 class MobileConverter(BaseConverter): def __init__(self, url_map ...

  2. 重构drf项目后的manage.py报错的问题

    Python3.6 用Django连接mysql一直报错django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer ...

  3. 【转】解决高版本springboot对Velocity不支持

    https://blog.csdn.net/sinat_31270499/article/details/82283880 最近在做关于Spring Boot开发的项目,因为项目中要用到Velocit ...

  4. java之高并发与多线程

    进程和线程的区别和联系 从资源占用,切换效率,通信方式等方面解答 线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元:而把传统的进程称为重型进程(H ...

  5. C# 调用 python3

    1.C# 调用python 本质上是使用命令行运行python 1.1 C# 使用命令行 program.cs using System; using System.Diagnostics; usin ...

  6. Seafile和Nextcloud相比较哪个好用

    面对大量的照片视频,备份资料成了很多网友的刚需.但现在各大免费网盘,关闭地关闭,收费的收费,自建网盘成了一个不得已的选择.可以自建私有网盘的网盘程序最出名的要数Seafile和Nextcloud,一款 ...

  7. Selenium(二)开发环境的搭建

    1.安装python的开发集成环境 我之前有写,可参考https://www.cnblogs.com/dydxw/p/10405797.html 2.使用selenium打开火狐浏览器 先从selen ...

  8. [唐胡璐]Selenium技巧 - 定制元素属性检查,并写到ReportNG中

    QTP 和Selenium 都会有这种要检查某一个控件元素属性的情况,比如去检查一个Button的显示文字是什么? 为了更方便的书写程序,并优美的显示到HTML测试报告中,做了以下几个小小的封装,只是 ...

  9. 如何DIY个性PE

    前言:有时候在网络上能找到很不错的PE(无忧启动论坛),但是有时候PE的功能仍不能满足自己的需要(软件过旧,缺少某些功能),这时候就显得自己DIYPE的重要性 需要的工具: WIMTOOL(必备) 软 ...

  10. JS 框架安全报告:jQuery 下载次数超过 1.2 亿次

    尽管 JavaScript 库 jQuery 仍被使用,但它已不再像以前那样流行.根据开源安全平台 Snyk 统计,目前至少十分之六的网站受到 jQuery XSS 漏洞的影响,甚至用于扩展 jQue ...