看过并发编程的书,这两种机制都有所了解,但不扎实其实。看到别人的博客描述的很精辟,于是转过来,感谢!

原文链接:https://blog.csdn.net/yen_csdn/article/details/51705687

inkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;

Java.util.concurrent.ConcurrentHashMap
ConcurrentHashMap是HashMap的线程安全版(但此类不允许null做键或者值),同Hashtable相比,ConcurrentHashMap不仅保证了访问的线程安全性,而且在效率上与Hashtable相比,有较大的提高。ConcurrentHashMap允许多个修改操作并发进行,他使用了锁分离的技术,即代码块锁,而不是方法锁。他使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示不同的部分,每个段其实就是一个小的hashtable,他们有自己的锁(ReentrantLock来实现)。只要多个修改发生在不同的段上,他们就可以并发进行。

java.util.concurrent.CopyOnWriteArrayList
CopyOnWriteArrayList中的add、set、remove等方法,都是用了ReentrantLock的lock()来加锁,unlock()来解锁。
当增加元素时使用Array.copyOf()来拷贝副本,在副本上增加元素,然后改变原引用指向副本,读操作不加锁。适合读操作远远多于写操作的应用。

java.util.concurrent.CopyOnWriteArraySet
CopyOnWriteArraySet是在CopyOnWriteArrayList的基础上使用了Java的装饰模式。
List和Set的区别同样适用于CopyOnWriteArrayList和CopyOnWriteArrayList。

CopyOnWrite机制介绍
CopyOnWrite容器是 写时复制的容器,就是我们往容器里写东西时,不是直接写,而是先Copy当前容器,然后往新容器里添加元素,在将原容器的引用指向新容器。这样做的好处是:可以并发的读,而不需要加锁,因为当前容器不会添加任何元素。CopyOnWrite容器是一种读写分离的思想。
应用场景:应用于读多写少的并发场景,
注意:减少扩容开销;使用批量添加(减少复制次数);
缺点:内存占用问题;数据一致性问题(CopyOnWrite机制只能保证最终的数据一致,不能保证实时数据一致,因此如果希望写入的数据能马上读到,就不应该用CopyOnWrite);

线程安全的集合类、CopyOnWrite机制介绍(转)相关推荐

  1. 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )

    文章目录 I . Java 集合的线程安全概念 ( 加锁同步 ) II . 线程不安全集合 ( 没有并发需求 推荐使用 ) III . 集合属性说明 IV . 早期的线程安全集合 ( 不推荐使用 ) ...

  2. Java异常处理及异常机制介绍

    Java异常处理及异常机制介绍 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. JAVA中用2种方法处理异常: 1.在发生异 ...

  3. DVWA爆破high等级与token机制介绍(附防爆破措施)

    验证码绕过 https://www.cnblogs.com/mxm0117/p/12599668.html 防爆破 https://www.cnblogs.com/cx59244405/p/10410 ...

  4. Java的垃圾回收机制介绍

    1.java的语言框架 (1)CPU->操作系统内核->应用层框架->JVM(java虚拟机)->Java字节码->Java源代码 (2)java是解释型语言,嵌入式常用 ...

  5. Binder通信机制介绍

    1.Binder通信机制介绍 这篇文章会先对比Binder机制与Linux的通信机制的差别,了解为什么Android会另起炉灶,采用Binder.接着,会根据 Binder的机制,去理解什么是Serv ...

  6. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  7. python线程创建对象_Python线程下thread对象的用法介绍(附实例)

    本篇文章给大家带来的内容是关于Python线程下thread对象的用法介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Thread对象 Thread类用于表示单独的控制 ...

  8. 对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全

    转载自 对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全 之前在公众号中问了这个问题:对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全? 三天之内收到1 ...

  9. 【重难点】【Java集合 02】Set、List、Map 的区别、常见的线程安全的集合类、Collection 为什么只能在 Iterator 中删除元素

    [重难点][Java集合 02]List.Set.Map 的区别.常见的线程安全的集合类.Collection 为什么只能在 Iterator 中删除元素 文章目录 [重难点][Java集合 02]L ...

最新文章

  1. 女儿社交媒体求生日卡 美96岁失明二战老兵收海量祝福
  2. linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用
  3. 比特币这么火热,看看这篇比特币初学者指南
  4. JS检查是否支持Storage
  5. Error: rpmdb open failed
  6. VMware的linux虚拟机实现和windows的文件共享
  7. SIEM比以往更重要的5个原因
  8. Bootstrap 禁用的按钮
  9. K3打印单据,提示:等待C盘释放空间,内存不足
  10. 线性模型第1讲:最小二乘法
  11. 剑指offer刷题专栏C++
  12. 在linux中PHP的集成环境吗,linux有php集成环境吗
  13. 【React自制全家桶】九、Redux入手
  14. 数据交易,距离生产要素市场化还有多远? | 2022全球数字价值峰会
  15. java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda...
  16. RHCE linux学习第一天
  17. XSS插入绕过一些方式总结
  18. 阿里云服务器域名备案、域名解析、以及解析域名到服务器指定端口号
  19. 广东计算机一级试题答案,广东计算机一级考试试题和答案
  20. 中英文标点符号的读法用法大全

热门文章

  1. android笔试题整理
  2. mysql主从复制的简单配置
  3. 基于postfix一步一步构建Mailserver,支持虚拟用户,支持WebMail
  4. MyEclipse优化---编程时更流畅
  5. 转载 :28 个 Unix/Linux 的命令行神器
  6. SQL函数设计——临时表的使用
  7. 可用性追踪是虚拟化网络的关键
  8. 自定义注解实现日志脱敏
  9. dos命令添加war包
  10. 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)...