java 多线程 同步类容器与并发类容器

本文探讨了同步容器和并发容器的区别,并详细介绍了ConcurrentHashMap和CopyOnWrite容器的工作原理及优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


多个并发写的时候 不会出现写不一致的问题 看源码 使用了重入锁的方式 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值