java 多线程 同步类容器与并发类容器
2017-02-27 23:28
309 查看
1.同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作。
同步类容器:如古老的Vector·HashTable.这些容器的同步功能都是有JDK的Collerctions.synchronized**等工厂方法去创建实现的。其底层的机制无非就是用传统的synchronized关键字对每个公用的方法进行同步的,使得每次只能一个线程访问容器的状态。这很明显不满足我互联网高并发的需求。
2.并发类容器
JDK5.0以后提供了多种并发类容器来代替同步类容器从而改善性能,同步类容器的状态都是串行化的,他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐量。
并发类容器是专门针对并发设计的,使用ConcurrentHashMap来代替给予散列的传统的HashTable,而且在ConcurrentHashMap中,添加了一些常见复合型操作的支持,以及CopyOnWriteArrayLsit代替Voctor,并发的CopyonWriteArraySet.
ConcurrentMap 接口有两个重要的实现:
ConcurrentHashMap
ConcurrentSkipListMap( 支持并发排序共鞥,弥补concurrentHashMap)
ConcurrentHashMap 内容使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的HashTable,他们有自己的锁,只要多个修改操作发生在不同的段上,它们就并发的进行,把一个整体分成了16个段,这也是在多线程场景时减少锁的粒度从而降低锁竞争的一种方案。并且代码肿大多共享变量使用volatile关键字声明,目的事第一时间获取修改的内容,性能非常好。
CopyOnWrite 容器即写时复制的容器,通俗的理解就是当我们往一个容器添加元素时,不直接往当前容器添加,而是将当前容器进行copy,复制出一个新的容器,然后新的容器里添加元素,添加元素之后,再将原元素的引用指向新的容器,这样做的好处事我们可以CopyOnWrite容器进行并发的读,而不需加锁,因为当前容器不会添加任何元素,所以CopyOnWrite 容器是一种读写分离的思想,读和写不同的容器
CopyOnWriteArrayLsit 和CopyonWriteArraySet
public class UseCopyOnWrite {
public static void main(String[] args) {
CopyOnWriteArrayList<String> cwal = new CopyOnWriteArrayList<String>();
CopyOnWriteArraySet<String> cwas = new CopyOnWriteArraySet<String>();
cwal.add(e);
}
}
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
多个并发写的时候 不会出现写不一致的问题 看源码 使用了重入锁的方式
同步类容器:如古老的Vector·HashTable.这些容器的同步功能都是有JDK的Collerctions.synchronized**等工厂方法去创建实现的。其底层的机制无非就是用传统的synchronized关键字对每个公用的方法进行同步的,使得每次只能一个线程访问容器的状态。这很明显不满足我互联网高并发的需求。
2.并发类容器
JDK5.0以后提供了多种并发类容器来代替同步类容器从而改善性能,同步类容器的状态都是串行化的,他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐量。
并发类容器是专门针对并发设计的,使用ConcurrentHashMap来代替给予散列的传统的HashTable,而且在ConcurrentHashMap中,添加了一些常见复合型操作的支持,以及CopyOnWriteArrayLsit代替Voctor,并发的CopyonWriteArraySet.
ConcurrentMap 接口有两个重要的实现:
ConcurrentHashMap
ConcurrentSkipListMap( 支持并发排序共鞥,弥补concurrentHashMap)
ConcurrentHashMap 内容使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的HashTable,他们有自己的锁,只要多个修改操作发生在不同的段上,它们就并发的进行,把一个整体分成了16个段,这也是在多线程场景时减少锁的粒度从而降低锁竞争的一种方案。并且代码肿大多共享变量使用volatile关键字声明,目的事第一时间获取修改的内容,性能非常好。
CopyOnWrite 容器即写时复制的容器,通俗的理解就是当我们往一个容器添加元素时,不直接往当前容器添加,而是将当前容器进行copy,复制出一个新的容器,然后新的容器里添加元素,添加元素之后,再将原元素的引用指向新的容器,这样做的好处事我们可以CopyOnWrite容器进行并发的读,而不需加锁,因为当前容器不会添加任何元素,所以CopyOnWrite 容器是一种读写分离的思想,读和写不同的容器
CopyOnWriteArrayLsit 和CopyonWriteArraySet
public class UseCopyOnWrite {
public static void main(String[] args) {
CopyOnWriteArrayList<String> cwal = new CopyOnWriteArrayList<String>();
CopyOnWriteArraySet<String> cwas = new CopyOnWriteArraySet<String>();
cwal.add(e);
}
}
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
多个并发写的时候 不会出现写不一致的问题 看源码 使用了重入锁的方式
相关文章推荐
- java多线程(10)--并发类容器 CopyOnWriteArrayList 的使用
- java同步类容器与并发类容器
- 【Java多线程】共享变量&同步-异步容器&线程局部变量
- Java多线程之同步类容器与并发容器
- 转:java多线程--同步容器
- java线程安全之同步类容器与并发类容器(十二)
- Java学习笔记—多线程(同步容器和并发容器)
- Java多线程之同步容器与并发容器
- java多线程(七) 之 同步容器类
- 跟着实例学习java多线程8-同步容器类的问题
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- Java多线程 同步 锁 条件对象
- java 多线程、线程池及同步
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- Java多线程之同步与死锁
- 初学Java多线程:使用Synchronized关键字同步类方法
- java基础之:多线程实现/启动/状态+同步+线程池
- java(多线程)实现高性能数据同步
- 2011-09-07 java多线程临界资源同步和调度问题,遇到困难加锁和解锁问题
- 【转】浅谈Java多线程的同步问题