线程安全的集合:

线程安全的集合有Vector、HashTable、Stack、ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue等。

1、Vector相当于 ArrayList 的翻版,是长度可变的数组,Vector的每个方法都加了 synchronized 修饰符,是线程安全的。

2、Hashtable是一个线程安全的集合,是单线程集合,它给几乎所有public方法都加上了synchronized关键字。

3、Stack继承于Vector, 栈是后进先出的。

4、ConcurrentHashMap 采用了分段锁(Segment),HashTable的加锁方法是给每个方法加上synchronized关键字,线程安全。

5、ArrayBlockingQueue不同于ConcurrentLinkedQueue,ArrayBlockingQueue是数组实现的,并且是有界限的;而ConcurrentLinkedQueue是链表实现的,是无界限的。

6、ConcurrentLinkedQueue是一种FIFO的无界队列,是线程安全的,它适用于“高并发”的场景。

7、LinkedBlockingQueue使用两个lock保证线程安全,ConcurrentLinkedQueue 使用CAS机制保证线程安全,ConcurrentLinkedQueue 性能比LinkedBlockingQueue高很多

ArrayBlockingQueue不同于ConcurrentLinkedQueue,ArrayBlockingQueue是数组实现的,并且是有界限的;而ConcurrentLinkedQueue是链表实现的,是无界限的。

线程安全的list:

一、Vector

Vector是大家熟知的线程安全的List集合,不过他的性能是最差,所有的方法都是加了synchronized来同步,从而保证线程安全。使用数组来存储数据。 它的增加、修改、获取、删除等都通过synchronized来同步。

二、Collections.SynchronizedList

SynchronizedList是Collections类的静态内部类,它能把所有 List 接口的实现类转换成线程安全的List,比 Vector 有更好的扩展性和兼容性。

它所有方法都是带同步对象锁的,和 Vector 一样,它不是性能最优的。

三、CopyOnWriteArrayList

它的添加时加锁的(ReentrantLock ,非synchronized同步锁),读操作是没有加锁。

添加或者删除元素时,先加锁,再进行复制替换操作,最后再释放锁。

它的优势在于,读操作是不加任和锁。这样做的好处是,在高并发情况下,读取元素时就不用加锁,写数据时才加锁,大大提升了读取性能。

Vector和CopyOnWriteArrayList都是线程安全的List,底层都是数组实现的,Vector的每个方法都进行了加锁,而CopyOnWriteArrayList的读操作是不加锁的,因此CopyOnWriteArrayList的读性能远高于Vector,Vector每次扩容的大小都是原来数组大小的2倍,而CopyOnWriteArrayList不需要扩容,通过COW思想就能使数组容量满足要求。

面试:线程安全的集合相关推荐

  1. 2020面试准备之Java集合

    文章目录 1.Java集合类框架的基本接口有哪些? 2.Collection 和 Collections 有什么区别? 3.为什么集合类接口没有实现 Cloneable 和 Serializable ...

  2. Java高级面试-超级全面-大厂集合

    Java研发工程师知识点总结 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 四.Java虚拟机 五.数据库(S ...

  3. Java——线程安全的集合

    线程安全的集合     java.util.concurrent包:ConcurrentHashMap,ConcurrentSkipListMap,ConcurrentSkipListSet,Conc ...

  4. java面试线程必备知识点,怼死面试官,从我做起

    转载自 java面试线程必备知识点,怼死面试官,从我做起 |--多线程一定好么? cpu密集不好 io密集好 |--如何减少上下文切换: 无锁并发(数据id根据Hash分段).CAS.最少线程 |-- ...

  5. 面试-线程池的成长之路

    转载自   面试-线程池的成长之路 背景 相信大家在面试过程中遇到面试官问线程的很多,线程过后就是线程池了.从易到难,都是这么个过程,还有就是确实很多人在工作中接触线程池比较少,最多的也就是创建一个然 ...

  6. Java多线程:线程安全和非线程安全的集合对象

    转载自  Java多线程:线程安全和非线程安全的集合对象 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到 ...

  7. Java核心技术 卷1 多线程----线程安全的集合(4)

    如果多线程要并发的修改一个数据结构,例如散列表,那么很容易会破坏这个数据结构.一个线程可能要开始向表中插入一个新元素.假定在调整散列表各个桶之间的链接关系的过程中,被剥夺了控制权.如果另一个线程也开始 ...

  8. 程序员面试金典——9.4集合的子集

    程序员面试金典--9.4集合的子集 Solution1:我的答案 该思路本质上是递归,递归的迭代式写法.之前做过类似的题,这个思路就挺好! class Subset { public:vector&l ...

  9. 程序员面试金典——3.3集合栈

    程序员面试金典--3.3集合栈 Solution1:主要总结下关于vector不太常用的函数 (1)c.pop_back():删除vector对象c中最后一个元素,若c为空,则函数行为未定义.函数返回 ...

最新文章

  1. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
  2. Scott Hanselman's 推荐的的实用工具集合(2011版)
  3. Python 对字典循环遍历的两种方式
  4. IONIC打包安卓遇到COM.ANDROID.SUPPORT:SUPPORT-V4错误的解决办法
  5. 【报告分享】 2020-2021智能手机消费趋势与用户忠诚和流失度报告-企鹅智库(附下载)
  6. 海思视频码率参数解析
  7. -bash: netstat: command not found
  8. The Elder(树形dp 斜率优化)
  9. php arcsin函数,excel如何计算反三角函数
  10. 古时候有个【百僧问题】,一百馒头一百僧,大僧三个更无争,小僧三人分一个,大小和尚各几丁? *...
  11. 自然语言处理实战——对电影评论进行情感分析(英文)
  12. MySQL 多表关联修改语句
  13. OpenGL-绘制旋转立方体
  14. Oracle 恢复删除数据
  15. head 10字节_优秀了!10万系谱,计算近交系数,不到1秒!
  16. Linux内核学习系列(7)——execve与需求加载
  17. 国际城市如何畅想未来交通
  18. P1265 公路修建
  19. 打光在绘画中的重要性有多重要?
  20. C语言的输入输出模型

热门文章

  1. matlab/simulink电力电子仿真三相可编程电压源three phase programmable voltage source的设置与使用
  2. 泛癌分析·找出各个癌症的预后相关基因
  3. 东芝(Toshiba)笔记本的型号解析
  4. 盘点近年来数据中心行业火灾
  5. [SQL Server无法连接到服务器]标题: 连接到服务器 --------- 无法连接到 ****
  6. 这样“断舍离”,你会活得更高级
  7. Linux电源管理之Runtime PM
  8. 【知识积累】腾讯云CentOS 7服务器安装蚂蚁笔记Leanote
  9. 能够在乱世中_曹操能够在乱世中称王称霸的最大资本-卓越的军事才能
  10. 【面试技巧】成功的面试自我介绍三步骤