• 线程安全的集合类、CopyOnWrite机制介绍(转)


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

    原文链接: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);

  • 相关阅读:
    浩辰CAD
    浩辰CAD直线
    浩辰CAD构造线
    浩辰CAD颜色
    浩辰CAD射线
    网站关于嵌入Youtube视频的相关文档
    快来一起玩转LiteOS组件:Curl
    如何利用MHA+ProxySQL实现读写分离和负载均衡
    政企上云网络适配复杂,看华为云Stack有妙招
    实践GoF的设计模式:单例模式
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/10101864.html
Copyright © 2020-2023  润新知