线程安全的集合有哪些
线程安全的集合有:1、Vector;2、HashTable;3、Stack;4、ArrayBlockingQueue;5、ConcurrentHashMap;6、ConcurrentLinkedQueue。其中,Vector实现线程安全的原理是为其所有需要保证线程安全的方法都添加了synchronized关键字,锁住了整个对象。
1、Vector
Vector是常用的Collection集合中的线程安全的集合,其实现线程安全的原理是为其所有需要保证线程安全的方法都添加了synchronized关键字,锁住了整个对象。Vector相当于 ArrayList 的翻版,是长度可变的数组,Vector的每个方法都加了 synchronized 修饰符,是线程安全的。
使用锁的种类:互斥锁。
2、HashTable
Hashtable与Vector类似,都是为每个方法添加了synchronized关键字,来实现的线程安全,锁住了整个对象。Hashtable是一个线程安全的集合,是单线程集合,它给几乎所有public方法都加上了synchronized关键字。
使用锁的种类:互斥锁。
3、Stack
stack 由于继承了Vector,因此也是线程安全的,底层是使用数组保存数据,大多数API都是使用Vector来保存。它最重要的属性是先进后出。至于数组扩容,沿用了Vector中的扩容逻辑。
4、ArrayBlockingQueue
ArrayBlockingQueue是一个阻塞队列,底层使用数组结构实现,按照先进先出(FIFO)的原则对元素进行排序。
5、ConcurrentHashMap
ConcurrentHashMap 采用了分段锁(Segment),HashTable的加锁方法是给每个方法加上synchronized关键字,线程安全。
6、ConcurrentLinkedQueue
ConcurrentLinkedQueue是一种FIFO的无界队列,是线程安全的,它适用于“高并发”的场景。
拓展阅读
线程安全的分类
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。线程安全的分类
不可变类
一个不可变的对象只要构建正确, 其外部可见状态永远不会改变, 永远也不会看到它处于不一致的状态。Java 类库中大多数基本数值类如Integer、String 和BigInteger 都是原子性的, 是不可变的, 但Long 和Double 就不能保证其操作的原子性, 可在声明变量的时候用volatile 关键字。不可变对象上没有副作用, 并且缓存不可变对象的引用总是安全的。一个不可变的对象的一个引用可以自由共享,而不用担心被引用的对象要被修改。
线程安全性类
线程安全性类的对象操作序列( 读或写其公有字段以及调用其公有方法) 都不会使该对象处于无效状态, 即任何操作都不会违反该类的任何不可变量、前置条件或者后置条件。
有条件的线程安全类
有条件的线程安全类对于单独的操作可以是线程安全的, 但是某些操作序列可能需要外部同步。为了保证其它线程不会在遍历的时候改变集合, 进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常, 独占性的访问是由对锁的同步机制保证的。
线程兼容类
线程兼容类不是线程安全的, 但可以通过正确使用同步从而在并发环境中安全地使用。或用一个synchronized 块包含每一个方法调用。
线程对立类
线程对立类是那些不管是否调用了外部同步都不能在并发使用时保证其安全的类。线程对立类很少见, 当类修改静态数据,而静态数据会影响在其它线程中执行的其它类的行为时, 通常会出现线程对立。