JAVA并发编程实战3同步容器
Posted cutter_point
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA并发编程实战3同步容器相关的知识,希望对你有一定的参考价值。
同步容器包括Vector和Hashtable,还有一些由Collections.synchronizedXxx等工厂方法创建的
1、同步容器类的问题
同步容器类都是线程安全的,但是有些时候还是要客户端加锁来保护复合操作
就比如vector的操作,如果又两个方法一个获取vector集合的最后一个元素,一个删除最后一个元素
那么可能两个线程在同时操作的时候,A线程首先正在获取最后一个元素,get(lastElement),而在这个过程中如果B元素正在删除,删除了最后一个(last)然后就可能导致A线程执行失败,报错
那么如何避免这个问题呢?
那就是吧获取最后一个位置的索引和获取数据复合操作加锁,使其成为一个原子操作。同理获取索引和删除也是加锁,把容器类作为锁的对象
2、隐藏迭代器
如下
package cn.xf.cp.ch05; import java.util.HashSet; import java.util.Random; import java.util.Set; public class HiddenIterator { private final Set<Integer> set = new HashSet<Integer>(); //添加与删除操作 public synchronized void add(Integer i) { set.add(i); } public synchronized void remove(Integer i) { set.remove(i); } public void addTenThings() { Random r = new Random(); for(int i = 0; i < 10; ++i) { add(r.nextInt()); } //注意这里可能会抛出异常,因为这里使用了set,但是没有加锁,也就是应该加上HiddenIterator的对象锁才可以 //而在输出日志的时候,我们的set会调用toString方法,而这个方法会对容器进行迭代 //也就是在调用toString方法的时候可能set会被修改,而迭代器在迭代的时候如果计数器被修改那么hasNext或next //将抛出ConcurrentModificationException异常 System.out.println("DEBUG: added ten elements to " + set); } }
以上是关于JAVA并发编程实战3同步容器的主要内容,如果未能解决你的问题,请参考以下文章
[Java 并发编程实战] 同步容器类潜在的问题(含实例代码)
高并发编程原理与实战.线程安全.锁原理.同步容器.实战之JAVA架构
[Java 并发编程实战] 集合框架之 同步容器类 & 并发容器类