精华内容
下载资源
问答
  • 哪些集合线程安全

    万次阅读 2019-05-06 16:43:48
    哪些集合线程安全的? Vector Stack Hashtable java.util.concurrent包下所有的集合 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque... 【Java面试题与...

    哪些集合类是线程安全的?

     

    Vector

    Stack

    Hashtable

    java.util.concurrent包下所有的集合类

                       ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...

     


    【Java面试题与答案】整理推荐

     

    展开全文
  • Hashtable:使用了synchronized关键字,所以相较于Hashmap是线程安全的。 ConcurrentHashMap:使用锁分段技术确保线性安全,是一种高效但是线程安全的集合。 Stack:栈,也是线程安全的,继承于Vector。 线性不安全的...

    线性安全的
    Vector:只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性
    Hashtable:使用了synchronized关键字,所以相较于Hashmap是线程安全的。
    ConcurrentHashMap:使用锁分段技术确保线性安全,是一种高效但是线程安全的集合。
    Stack:栈,也是线程安全的,继承于Vector。

    线性不安全的
    Hashmap
    Arraylist
    LinkedList
    HashSet
    TreeSet
    TreeMap

    Hashmap:HashMap在put操作的时候,如果插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是resize,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。

    Arraylist: List 对象在做 add 时,执行 Arrays.copyOf 的时候,返回一个新的数组对象。当有线程 A、B… 同时进入 grow方法,多个线程都会执行 Arrays.copyOf 方法,返回多个不同的 elementData 对象,假如,A先返回,B 后返回,那么 List.elementData ==A. elementData,如果同时B也返回,那么 List.elementData ==B. elementData,所以线程B就把线程A的数据给覆盖了,导致线程A的数据被丢失。

    LinkedList:与Arraylist线程安全问题相似,线程安全问题是由多个线程同时写或同时读写同一个资源造成的。

    HashSet:底层数据存储结构采用了Hashmap,所以Hashmap会产生的线程安全问题HashSet也会产生。

    展开全文
  • 文章目录脑图概述字符串拼接子之StringBuilder、StringBufferStringBuilder (线程不安全)StringBuffer (线程安全)小结时间相关的 SimpleDateFormat、第三方库joda-time、JDK8提供的SimpleDateFormat (线程不...


    在这里插入图片描述

    脑图

    在这里插入图片描述


    概述

    前两篇博客,我们说了 通过 不可变变量线程封闭 这两种方式来实现线程安全。

    这里我们来介绍下很常见的线程不安全的类

    所谓线程不安全的类,是指一个类的实例对象可以同时被多个线程访问,如果不做同步或线程安全的处理,就会表现出线程不安全的行为,比如逻辑处理错误、抛出异常等。


    字符串拼接子之StringBuilder、StringBuffer

    • StringBuilder 一个可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。
    • StringBuffer 也是继承于AbstractStringBuilder的子类;
    • StringBuilderStringBuffer不同,前者是非线程安全的,后者是线程安全的。

    StringBuilder (线程不安全)

    在这里插入图片描述

    运行结果

    在这里插入图片描述

    结果不等于5000,在多线程情况下,StringBuild是线程不安全的.


    StringBuffer (线程安全)

    在这里插入图片描述

    运行结果

    在这里插入图片描述

    结果等于5000,在多线程情况下,StringBuffer是线程安全的.


    小结

    既然StringBuffer是线程安全的, 那为何JDK还要提供StringBuilder呢?

    StringBuffer之所以是线程安全的原因是几乎所有的方法都加了synchronized关键字,所以是线程安全的。 synchronized 同一时间只能有一个线程访问,所以性能会相对较差。

    在上篇博文 并发编程-11线程安全策略之线程封闭中,我们了解到 线程封闭可以确保线程安全,其中线程封闭的一种实现方式时堆栈封闭,说白了就是局部变量

    所以推荐在堆栈封闭等线程安全的环境下(方法中的局部变量)应该首先选用StringBuilder。


    时间相关的类 SimpleDateFormat、第三方库joda-time、JDK8提供的类

    SimpleDateFormat 的实例对象在多线程共享使用的时候会抛出转换异常,正确的使用方法应该是采用堆栈封闭,将其作为方法内的局部变量而不是全局变量,在每次调用方法的时候才去创建一个SimpleDateFormat实例对象,这样利用堆栈封闭就不会出现并发问题

    另一种方式是使用第三方库joda-time的DateTimeFormatter类 或者JDK8新提供的类 : 不可变类且线程安全 LocalDate 、java.time.LocalTime 和LocaldateTime 新的Date和Time类DateTimeFormatter


    SimpleDateFormat (线程不安全的写法)

    在这里插入图片描述
    执行结果:表现出了异常
    在这里插入图片描述


    SimpleDateFormat (线程安全的写法-堆栈封闭)

    在这里插入图片描述

    没有抛出异常

    在这里插入图片描述
    线程安全,无异常


    joda-time (线程安全)

    在这里插入图片描述
    线程安全,无异常


    JDK8的时间处理类(线程安全)

    在这里插入图片描述
    线程安全,无异常


    Collections 中线程不安全的类

    通常情况下,我们都是在方法内部作为局部变量使用这些集合类,很少会触发线程不安全的问题。

    如果在某些情况下定义成static,而且多个线程可以修改的时候就容易出现多线程不安全的问题。


    ArrayList (线程不安全)

    在这里插入图片描述

    计数错误,线程不安全
    在这里插入图片描述


    HashSet (线程不安全)

    在这里插入图片描述

    计数错误,线程不安全

    在这里插入图片描述


    HashMap (线程不安全)

    在这里插入图片描述

    计数错误,线程不安全

    在这里插入图片描述


    注意事项 (先检查后执行-- 线程不安全)

    有一种写法需要注意,即便是线程安全的对象,在这种写法下也可能会出现线程不安全的行为,这种写法就是先检查后执行

    if(condition(a)){
        handle(a);
    }
    

    在这个操作里,可能会有两个线程同时通过if的判断,然后去执行了处理方法,那么就会出现两个线程同时操作一个对象,从而出现线程不安全的行为。这种写法导致线程不安全的主要原因是因为这里分成了两步操作,这个过程是非原子性的,所以就会出现线程不安全的问题。


    代码

    https://github.com/yangshangwei/ConcurrencyMaster

    展开全文
  • java中哪些集合是线程安全的,哪些是线程不安全的

    万次阅读 多人点赞 2019-05-09 11:41:42
    线程安全和线程不安全的集合3. 如何综合考虑线程不安全和效率低的问题 1. 常见集合 这里自己总结了一些比较常见的java集合,对于这些集合的特点和区别后期博客中会进行总结介绍: 2.什么叫“集合是线程不安全的” ...

    1. 常见集合

    这里自己总结了一些比较常见的java集合,对于这些集合的特点和区别后期博客中会进行总结介绍:
    常见java集合

    2.什么叫“集合是线程不安全的”

    首先我们来了解一下什么叫集合是线程不安全的:

    当多个并发同时对非线程安全的集合进行增删改的时候会破坏这些集合的数据完整性;
    例如:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。

    3. 线程安全和线程不安全的集合

    Vector、HashTable、Properties是线程安全的;

    ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。

    值得注意的是:为了保证集合是线程安全的,相应的效率也比较低;线程不安全的集合效率相对会高一些。

    4. 如何综合考虑线程不安全和效率低的问题

    为了保证集合既是安全的而且效率高,Collections为我们提出了解决方案,把这些集合包装成线程安全的集合。
    Collections提供了如下几个静态方法。

    
    <T> Collection<T> synchronizedCollection(Collection<T> c); //返回指定collection 对应的线程安全的collection。
    static <T> List<T> synchronizedList(List<T> list); //返回指定List对象对应的线程安全的List 对象。
    static <K, V> Map<K, V> synchronizedMap(Map<K, V> m); //返回指定Map对象对应的线程安全的Map对象。
    static <T> Set<T> synchronizedSet(Set<T> s); //返回指定Set对象对应的线程安全的Set对象。
    static <K, V> SortedMap<K, V> synchronizedSortedMap(SortedMap<K, V> m); //返回指定SortedMap对象对应的线程安全的SortedMap对象。
    
    

    当然,在实际工作中,公司都会自己封装一些线程安全且效率高的集合。

    展开全文
  • 哪些集合线程安全的?

    千次阅读 2019-08-05 18:06:51
    答案: vector:就比arraylist多了个同步化机制(线程安全) ...这几个线程安全的集合基本上都是jdk1.1中出现的,基本上实现方式就是直接对方法上锁,锁的粒度太大了,所以性能不是很好。 像vector因为效率...
  • 线程安全类--Collections.synchronizedList()

    千次阅读 2017-04-19 16:38:15
    即使是线程安全类,也应该特别小心,因为操作的线程是间仍然不一定安全。   举个形象的例子,比如一个集合是线程安全的,两个线程在操作同一个集合对象,当第一个线程查询集合非空后,删除集合中所有元素的...
  • Java哪些集合线程安全的?

    万次阅读 2019-07-05 15:30:43
    早在jdk的1.1版本中,所有的集合都是线程安全的。但是在1.2以及之后的版本中就出现了一些线程不安全的集合,为什么版本升级会出现一些线程不安全的集合呢?因为线程不安全的集合普遍比线程安全的集合效率高的多。...
  • 1、线程安全类:不同线程对同一个类的对象进行操作,例如在不同线程调用同一个对象的类成员函数,是安全的,互不妨碍的,则说明该类是线程安全的,Qt中线程安全的类QMutex、QMutexLocker、QReadWriteLock、QReadL....
  • java线程安全的容器有哪些

    万次阅读 2017-07-09 16:35:27
    同步容器:使用了synchronized Vector HashTable 并发容器: ConcurrentHashMap:分段 ...ConcurrentLinkedQueue:是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。
  • Vector并非是绝对的线程安全类

    千次阅读 2018-07-18 17:36:58
    众所周知,Vector是一个线程安全的类,其在add()等操作上添加了synchronized关键字实现同步,但是并非是绝对的线程安全类. 当进行迭代遍历时,如果在另一个线程执行add(),remove()操作,仍然会机率抛出异常...
  • 通过Collections将集合转换为线程安全类集合
  • java四大线程安全类

    千次阅读 2018-08-01 23:07:34
  • C# 线程安全集合

    千次阅读 2019-07-05 11:56:01
    从.Net 4.0框架开始,在System.Collections.Concurrent命名空间下,增加了用于多线程协同的并发集合(线程安全集合)。 线程安全集合: 就是当多线程访问时,采用了加锁的机制;即当一个线程访问集合时,会对这个...
  • java线程安全类时间处理

    千次阅读 2018-07-27 14:50:04
    SimpleDateFormat是线程安全, 关于时间处理推荐进行如下,如果是jdk低于1.7用: public final static String DATE_PATTERN = "yyyy-MM-dd"; private static ThreadLocal&lt;DateFormat&gt; ...
  • 前言今天我们来研究一下Util包下的ArrayList,及其相关的线程安全实现,具体包括Vector、CopyOnWriteArrayList和集合工具Collections提供的synchronizedList。首先我们知道ArrayList是非线程安全的,而在同一...
  • 线程安全

    千次阅读 2017-03-04 17:35:00
    线程安全 A:StringBuffer B:Vector C:Hashtable D:如何把一个线程不安全的集合变成一个线程安全的集合 用Collections工具的方法即可。 static   Collection   ...
  • Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《并发集合系列》教程的第二篇: 本文主要...
  • C++多线程安全类的问题

    千次阅读 2015-02-28 18:22:59
    我们是多么渴望各种C++都是多线程安全的,然而一旦涉及到对象间的交互,这样的渴望可能就只能是奢望了。下面,我们以设计一个双向链结点为例,看看要使其多线程安全将会带来一些什么问题。 class ...
  • 在JDK1.5的发行版本中,Java平台新增了java.util.concurrent,这个包中提供了一系列的线程安全集合、容器和线程池,利用这些新的线程安全类可以极大地降低Java多线程编程的难度,提升开发效率。 新的并发编程包中的...
  • 一般来说除非特别声明,大多数的默认都不是线程安全的。对于其中的一些来说,这是很合理的,但是对于另外一些来说就很有趣了。 就算是在经验丰富的 iOS/Mac 开发者,也难免会犯从后台线程去访问 UIKit/AppKit ...
  • Java常见的线程安全

    千次阅读 2017-04-12 17:40:54
    通过synchronized 关键字给方法加上同步的内置锁来实现线程安全 ...原子类Atomicxxx—包装类的线程安全类 如AtomicLong,AtomicInteger等等,Atomicxxx 是通过Unsafe 类的native方法实现线程安全的
  • 线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染...
  • 线程安全

    万次阅读 2017-04-12 11:49:42
    *线程安全就是当多个线程访问某一个(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个(对象或方法)就是线程安全的。2.举例说明public class MyThread extends Thread{ private int count = 5 ; ...
  • Java多线程之集合(浅析线程安全和不安全) 本文目录: 1.线程不安全之ArrayList,HashSet,HashMap和线程安全之CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap 2. 小结 3.解析...
  • 线程安全 & 线程安全函数 & 线程不安全函数 线程安全 就是多线程访问时,采用了加锁机制,当一个线程访问该的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不...
  • Java中的线程安全集合

    千次阅读 2018-08-16 14:22:41
    线程安全集合 包括: StringBuffer: 线程安全 String: 不可变的 , 都线程安全 Random: 线程安全 Vector: 实现了List,并且线程安全 Hashtable: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 658,829
精华内容 263,531
关键字:

线程安全类有哪些