线程非安全的方法getNext()java
import net.jcip.annotations.NotThreadSafe; @NotThreadSafe public class UnSafeSequence { private int value; public int getNext() { return value++; } }
一、最开始的目的是测试线程池执行getNext()方法的返回值安全
main函数以下:函数
public class UnSafeQequenceTest { /** * @throws ExecutionException * @throws InterruptedException */ public static void main(String[] args) { UnSafeSequence unSafeSequence = new UnSafeSequence(); ExecutorService executors = Executors.newCachedThreadPool(); for (int i = 0; i < 100; i++ ) { executors.submit(() -> System.out.println(unSafeSequence.getNext())); } executors.shutdown(); } }
结果如预期般是乱序的:测试
二、顺便试一下采用Future来接收线程执行的结果线程
main方法修改以下:code
public class UnSafeQequenceTest { /** * @throws ExecutionException * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException, ExecutionException { UnSafeSequence unSafeSequence = new UnSafeSequence(); List<Integer> lstNumber = new ArrayList<Integer>(); ExecutorService executors = Executors.newCachedThreadPool(); for (int i = 0; i < 100; i++ ) { Future<Integer> future = executors.submit(() -> unSafeSequence.getNext()); Integer temp = future.get(); System.out.println(temp); lstNumber.add(temp); } Integer max = 0; for (Integer e : lstNumber) { if (e >= max) { max = e; } else { System.out.println(e); System.out.println(lstNumber); } } executors.shutdown(); } }
而后执行的结果是:对象
输出的顺序没有丝毫问题,WTF?这好像不太正常啊 blog
难道是Future对象获取线程返回结果时致使的主线程阻塞引发的之外效果?ip