(九)JDK源码分析之使用线程安全的集合框架

  • 概述
    在我们开发当中多少会遇到线程安全的问题,虽然现在开发中遇到线程安全情况还是少的,因为在开发中我们很少会用共享变量,因为会尽量避免这种情况,特别是做简单的CURD。当然,现在架构都是微服务架构,jdk这种底层锁也只是对一台jvm有效,但是我们还是了解下,这样才能应对更复杂(分布式锁)的情况。

  • 使用线程安全集合的方式
    1.直接使用jdk中有线程安全替代的集合实现。在jdk中常见的有set,list,map的集合实现,你由于业务系统的原因,会选择不同的结构。比如你的需求是集合中不要重复元素,那么你会选择set,如果需要线程安全,那你就要选择线程安全的set了,list和map也是一样的情况。
    a.线程安全List: Vector(synchronized),CopyOnWriteArrayList(Lock)
    b.线程安全Set: CopyOnWriteArraySet(Lock)
    c.线程安全的Map: Hashtable(synchronized),ConcurrentHashMap(synchronized)

  • 使用Collections直接转换
    直接使用Collections这个工具类的内部实现达到线程安全的目的,也分别对set,list,map做了不同实现,分别为SynchronizedSet,SynchronizedList,SynchronizedMap,实现原理很简单,这几个线程安全实现都是直接对set,list,map的读写方法写一个代理的同步代码块,比如如下:
    在这里插入图片描述

  • Vector和CopyOnWriteArrayList区别
    1.使用的锁不一样Vector使用synchronized,CopyOnWriteArrayList使用Lock
    2.Vector读写方法都加了锁;CopyOnWriteArrayList方法只是写加了锁,读采用最新版本数据,但是不能保证读到的数据是最新的,适合读多写少的场景

  • Hashtable和ConcurrentHashMap区别
    1.Hashtable简单的在读写方法加synchronized;ConcurrentHashMap采用分段加锁的机制,这样有利于提高并发量

  • 总结
    1.想要做到线程安全其实很简单,无非就是做同步,做同步也就两种方式加锁,要么通过
    synchronized,要么通过Lock。
    2.通过CopyOnWrite这个系列的安全集合,我们可以学习到一些提高并发的思想,比如舍去数据的准确性,提高性能,这主要是看我们场景,写少读多场景,使用起来,既可保证数据准确,又可保证性能。

发布了65 篇原创文章 · 获赞 11 · 访问量 7136

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/103859095