public static void main(String[] args) throws Exception { //create a memoizer that performs factorials final Memoizer<Integer, Integer> memo = new Memoizer<Integer, Integer> (new Computable<Integer, Integer>() { @Override public Integer compute(Integer a) { int result = 1 ; for(int i = 1 ; i < a ; i++){ result = result*i; } return result; } }); //now call the memoizer System.out.println(memo.compute(10)); //call it with 10 threads concurrently ExecutorService exec = Executors.newFixedThreadPool(10); ExecutorCompletionService<Integer> compService = new ExecutorCompletionService<Integer>(exec); for(int i = 0 ; i < 15 ; i++){ compService.submit(new Callable<Integer>(){ @Override public Integer call() throws Exception { return memo.compute(5); } }); } exec.shutdown(); for(int i = 0 ; i < 15 ; i++){ System.out.println(compService.take().get()); }}
因此,如果两个线程尝试在完全相同的时间计算相同的阶乘,则由于
putIfAbsent线程安全,因此只有其中一个将实际执行计算。第二个线程将简单地获取第一个线程在地图中放置的future,并等待其完成。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)