软件构造tips-关于jdk中一些线程安全的数据类型的实现

软件构造tips-关于jdk中一些线程安全的数据类型的实现

一·方法加锁

StringBuffer类
我们在java.lang文件夹下可以看到StringBuffer的源码:
软件构造tips-关于jdk中一些线程安全的数据类型的实现
我们可以非常清楚地看到,StringBuffer的方法添加了synchronized前缀,将方法添加了锁,这样每一个方法的调用都是原子化的,达到了线程安全的目的。但是这种类由于对方法进行了加锁,所以并行性并不乐观。
与此相似的常用类还有:HashTable类
软件构造tips-关于jdk中一些线程安全的数据类型的实现
Stack类
软件构造tips-关于jdk中一些线程安全的数据类型的实现
vector类
软件构造tips-关于jdk中一些线程安全的数据类型的实现
等等

二.分段锁

ConcurrentHashMap类为例:
在这种机制下,每一把锁只是用于锁住一部分数据,那么当多线程访问Map里的不同数据段的数据时,线程间就不会存在锁竞争。此法保证了线程安全的同时,比起直接给方法加锁粒度更加小,并行性更加高。
软件构造tips-关于jdk中一些线程安全的数据类型的实现
相似策略的类:
软件构造tips-关于jdk中一些线程安全的数据类型的实现

三.CopyOnWriteArrayList类

该类通过ReentrantLock显式地加锁,使用unlock解锁。在添加元素时,首先使用copyof方法创建一个副本,然后在副本中添加元素,再修改原引用指向该副本达成目的。因此该类在读操作时不需加锁,而在写操作时需要加锁。在读操作居多而写操作不太多时可以达到一个较高的并行效果。
软件构造tips-关于jdk中一些线程安全的数据类型的实现

四.synchronizedCollection方法

对于一些线程不安全的集合类,可以通过使用collections类的synchronizedCollection方法进行包装,将之变成线程安全的:
软件构造tips-关于jdk中一些线程安全的数据类型的实现
他的实现方式是返回一个新的对象,这个对象的内部方法加上synchronized前缀:、
软件构造tips-关于jdk中一些线程安全的数据类型的实现
软件构造tips-关于jdk中一些线程安全的数据类型的实现