来自http://www.iteye.com/topic/363625
3、并发集合类
集合类是大家编程时经常要使用的东西,ArrayList、HashMap什么的,java.util包中的集合类有的是线程安全的,有的则不是,在编写多线程的程序时使用线程安全的类能省去很多麻烦,但这些类的性能如何呢?java.util.concurrent包中提供了几个并发结合类,例如ConcurrentHashMap、ConcurrentLinkedQueue和CopyOnWriteArrayList等等,根据不同的使用场景,开发者可以用它们替换java.util包中的相应集合类。
CopyOnWriteArrayList是ArrayList的一个变体,比较适合用在读取比较频繁、修改较少的情况下,因为每次修改都要复制整个底层数组。ConcurrentHashMap中为Map接口增加了一些方法(例如putIfAbsenct()),同时做了些优化,总之灰常之好用,下面的代码中使用ConcurrentHashMap来作为全局节点表,完全无需考虑并发问题。ValidationService中只是声明(第17行),具体的使用是在上面的ValidationTask中。
- package service;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.concurrent.ConcurrentHashMap;
- /**
- * 执行验证的服务类
- *
- * @author DigitalSonic
- */
- public class ValidationService {
- /**
- * 全局节点表
- */
- public static final Map<String, Node> NODE_MAP = new ConcurrentHashMap<String, Node>();
- private ThreadPoolService threadPoolService;
- public ValidationService(ThreadPoolService threadPoolService) {
- this .threadPoolService = threadPoolService;
- }
- /**
- * 给出一个入口节点的WSDL,通过广度遍历的方式验证与其相关的各个节点
- *
- * @param wsdl 入口节点WSDL
- */
- public void validate(List<String> wsdl) {
- List<String> visitedNodes = new ArrayList<String>();
- List<String> nextRoundNodes = new ArrayList<String>();
- nextRoundNodes.addAll(wsdl);
- while (nextRoundNodes.size() > 0 ) {
- List<ValidationTask> tasks = getTasks(nextRoundNodes);
- List<Node> nodes = threadPoolService.invokeAll(tasks);
- visitedNodes.addAll(nextRoundNodes);
- nextRoundNodes.clear();
- getNextRoundNodes(nodes, visitedNodes, nextRoundNodes);
- }
- }
- private List<String> getNextRoundNodes(List<Node> nodes,
- List<String> visitedNodes, List<String> nextRoundNodes) {
- for (Node node : nodes) {
- for (String wsdl : node.getDependencies()) {
- if (!visitedNodes.contains(wsdl)) {
- nextRoundNodes.add(wsdl);
- }
- }
- }
- return nextRoundNodes;
- }
- private List<ValidationTask> getTasks(List<String> nodes) {
- List<ValidationTask> tasks = new ArrayList<ValidationTask>(nodes.size());
- for (String wsdl : nodes) {
- tasks.add(new ValidationTask(wsdl));
- }
- return tasks;
- }
- }