赞
踩
目录
在我们之前使用的集合类中,大部分都是线程不安全的。
Vector,Stack,HashTable是线程安全的,之前单线程环境就几乎不使用,即使在多线程环境在也不建议使用。因为这些集合类只是在内部自带了 synchronized,但不能保证有锁就一定线程安全。
对于使用 ArrayList,有以下几种方案:
1. 自己手动加锁(synchronized)
2. 使用 Collections.synchronizedList(new ArrayList) 创建列表
3. 使用 CopyOnWriteArrayList
使用前面案例讲过的标准库中的阻塞队列即可。
平时经常使用的 HashMap,本身就是线程不安全的。
在多线程环境下可以使用:
前面说过,HashTable是不推荐使用的。
HashTable 只是简单粗暴的把关键方法加上了 synchronized 关键字。
这相当于直接针对 HashTable 对象本身加锁。
而标准库中提供了更好的代替,ConcurrentHashMap,对上述问题做出了改进和优化.
以Java1.8为例
1. 使用"锁桶"的方式,来代替"一把全局锁",有效降低锁冲突的概率
2. 充分利用CAS特性
3. 优化了扩容方式:化整为零
ConcurrentHashMap 在Java1.7采用的是锁分段技术,简单来说就是把若干个哈希桶分成一个段(Segment),针对每个分段进行加锁。目的也是为了降低锁竞争的概率,只有当多个线程访问的数据恰好在一个段上的时候,才触发锁竞争。Java1.8则进行的就是上述"锁桶"的优化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。