您的位置:首页 > 编程语言 > Java开发

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();
}
}

多个并发写的时候 不会出现写不一致的问题 看源码 使用了重入锁的方式 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: