BitTigerio 2018-01-02
private static class UnsafeSequence { private int value; public int getNext() { return value++; } }
使用两个线程分别调用上面的getNext方法1000次,出现了一次线程不安全的情况,在转出的结果中有两个1311:
图片.png
原因分析,与书上说的一致:
图片.png
import java.io.PrintWriter; import java.util.concurrent.CountDownLatch; /** * Created by luohao07 on 2018/1/2. */ public class UnsafeSequenceTest { public static void main(String[] args) throws Exception{ UnsafeSequence unsafeSequence = new UnsafeSequence(); PrintWriter out = new PrintWriter("out.txt"); CountDownLatch countDownLatch = new CountDownLatch(2); new Thread() { @Override public void run() { for (int i = 0; i < 1000; i++) { out.println(unsafeSequence.getNext() + " T1"); } countDownLatch.countDown(); } }.start(); new Thread() { @Override public void run() { for (int i = 0; i < 1000; i++) { out.println(unsafeSequence.getNext()+" T2"); } countDownLatch.countDown(); } }.start(); countDownLatch.await(); out.flush(); out.close(); } private static class UnsafeSequence { private int value; public int getNext() { return value++; } } }
public class TimerTest { public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("invoke...."); } }, new Date(System.currentTimeMillis() + 5000)); } }
程序启动后5秒输出invoke....
<strong>欢迎加入学习交流群569772982,大家一起学习交流。</strong>