-
概述
在我们开发当中多少会遇到线程安全的问题,虽然现在开发中遇到线程安全情况还是少的,因为在开发中我们很少会用共享变量,因为会尽量避免这种情况,特别是做简单的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这个系列的安全集合,我们可以学习到一些提高并发的思想,比如舍去数据的准确性,提高性能,这主要是看我们场景,写少读多场景,使用起来,既可保证数据准确,又可保证性能。
(九)JDK源码分析之使用线程安全的集合框架
猜你喜欢
转载自blog.csdn.net/weixin_38312719/article/details/103859095
今日推荐
周排行