ode : 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; } } 4、AtomicInteger 对变量的读写操作都是原子操作(除了long或者double的变量),但像数值类型的++ --操作不是原子操作,像i++中包含了获得i的原始值、加1、写回i、返回原始值,在进行类似i++这样的操作时如果不进行同步问题就大了。好在java.util.concurrent.atomic为我们提供了很多工具类,可以以原子方式更新变量。 以AtomicInteger为例,提供了代替++ --的getAndIncrement()、incrementAndGet()、getAndDecrement()和decrementAndGet()方法,还有加减给定值的方法、当前值等于预期值时更新的compareAndSet()方法。 下面的例子中用AtomicInteger保存全局验证次数(第69行做了自增的操作),因为validateNode()方法会同时被多个线程调用,所以直接用int不同步是不行的,但用AtomicInteger在这种场合下就很合适。Java代码 package service.mock; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import service.Node; /** * 模拟执行节点验证的Mock类 * * @author DigitalSonic */ public class MockNodeValidator { public static final List<Node> ENTRIES = new ArrayList<Node>(); private static final Map<String, Node> NODE_MAP = new HashMap<String, Node>(); private static AtomicInteger count = new AtomicInteger(0); private static Logger logger = Logger.getLogger("MockNodeValidator"); /* * 构造模拟数据 */ static { Node node0 = new Node("NODE0", "http://node0/check?wsdl"); //入口0 &nb