java并发编程实战第一章

线程不安全代码测试
private static class UnsafeSequence {
        private int value;

        public int getNext() {
            return value++;
        }
    }

使用两个线程分别调用上面的getNext方法1000次,出现了一次线程不安全的情况,在转出的结果中有两个1311:


java并发编程实战第一章

图片.png


原因分析,与书上说的一致:


java并发编程实战第一章

图片.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++;
        }
    }
}
Timer执行定时任务
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>

相关推荐