并发容器1 vs 同步容器

同步容器vs并发容器
同步容器:Vetor HashTable
特点:
(1)不保证线程安全,需要额外加锁访问,访问方式使用Iterator迭代器或for-each遍历,加锁访问时间长,若不想加锁,使用克隆的方式,但创建副本的时候,存在较大性能开销。
(2)单线程下:不支持foreach边迭代边修改或删除。可以使用Iterator迭代器边迭代边修改删除。
(3)多个线程对同一个同步容器的Iterator迭代器操作,在Iterator.next()可能会发生异常。在调用Iterator时加锁可解决。
(4)Collections.synchronizedList(),里面可添加ArrayList,方法里的操作,把list的add()等操作外面都加了一层Sychronized.

并发容器:CopyOnWrite系列、 Concurrent系列、 BlockingQueue系列
特点:每个并发容器的设计都不一样,根据具体场景设计,尽量避免使用锁。
比如CopyOnWrite系列使用克隆的方式避免并发。
ConcurrentBlockingQueue:基于queue实现FIFO队列,队列为空取操作被阻塞。
ConcurentLinkedQueue:基于queue实现,队列为空返回null.
(1)CopyOnWrite单线程下,支持foreach边迭代边修改或删除。不支持Iterator边迭代边修改删除。因为CopyOnWriteList本身不支持remove(),直接抛异常。
(2)多个线程对同一个容器foreach操作,多线程同时remove(),因为remove()时list里没有这个元素了,并不会执行。和remove()的实现有关。

1、HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,主要的区别有:线程安全性,同步(synchronization),以及速度。HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(**HashMap可以接受为null的键值(key)**和值(value),而Hashtable则不行)。

HashMap是非synchronized,而Hashtable是synchronized,意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器。HashMap可以通过下面的语句进行同步:Map m = Collections.synchronizeMap(hashMap);
https://www.cnblogs.com/steven520213/p/8192091.html

2、CopyOnWriteArrayList
内部持有一个ReentrantLock lock = new ReentrantLock(),读写分离,写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array。
只是在增删改上加锁,但是读不加锁,CopyOnWriteArrayList支持读多写少的并发情况。

3、AtomicInteger、AtomicBolean、AtomicLog 原子更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值