科普:同步容器以及并发容器

    经典的同步容器有HashMap以及Vector,底层的实现机制无非就是使用synchronized关键字对每一个方法进行修饰,保证容器操作的同步,但是性能很低,无法满足现如今互联网时代的高并发要求。

    JDK5.0以后便开始使用并发类容器来替代同步类容器,原因是同步容器虽然实现了线程安全,但是基本上一次访问只能有一个线程在操作,极大的降低了效率和并发性,所以慢慢的使用ConcurrentHashMap来替代HashTable。

    首先我们来说说ConcurrentHashMap和HashTable的区别:HashTable的实现就是把整个对象上一把大锁,当任何线程访问该对象时,便上锁,其他对象如果想要访问该对象,即使操作的不是同一个段,都会被阻塞,然后等待。

    而ConcurrentHashMap则引入了段segment的概念,对分段加锁,每一个分段相当于一个HashTable,允许并发操作,效率极大地得到了提升,最多可以有16个段,其通过减小锁的粒度来降低锁竞争。

    再有就是一个CopyOnWrite容器,也是一个并发容器,简称COW容器,顾名思义,也就是在写的时候会拷贝一份副本,对原对象不需要进行加锁,所以当一个线程在写操作的时候,其他线程还是可以对原对象进行读操作,当写操作完成时,会把指针指向修改后的对象。适用于读多写少的场景,因为,当对象集合十分大的时候,如果有多个线程进行写操作,也就意味着需要频繁地复制副本,另外也需要加锁,防止数据不一致的问题。(多个写是无法并发的,只能同步,读不加锁,写加锁,就是他的理念)

    包括Queue队列数据结构也是有两种类型的,当然他们都是实现了Queue接口的。一种是ConcurrentLinkedQueue,他是无阻塞队列,不存在加锁,可以满足高并发的需求,也是线程安全的,另外一种便是BlockingQueue接口,为阻塞队列,在入队和出队时会加锁,有五种实现方式。简单介绍下:ArrayBlockingQueue,是一种定长的阻塞队列,长度需要定义;LinkedBlockingQueue,是一种不定产的阻塞队列,长度可定义;以及一个无缓存队列,生产者产生的数据会直接被消费者消费;还有具有优先级的队列,数据对象必须实现Compareable接口;和DelayQueue,其中的数据元素只有指定的时间到了,才能被获取,元素必须实现Delayed接口。他们的方法有add,offer,poll,take。(阻塞队列和非阻塞队列都是线程安全的,区别在于阻塞队列对入队和出队上了锁,而非阻塞队列没有上锁,采用CAS算法实现,效率很高,两者都能满足多线程并发场景,只是非阻塞队列需要手动编写代码进行取元素非空的判断)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值