zoukankan      html  css  js  c++  java
  • java并发编程实战第一章

    线程不安全代码测试
        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++;
            }
        }
    }
    
    
    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....

    欢迎加入学习交流群569772982,大家一起学习交流。
  • 相关阅读:
    shell变量/环境变量和set/env/export用法_转
    常用英语短语累积
    可执行文件格式elf和bin
    spring boot 配置文件application
    (转)Linux命令grep
    plsql 数据迁移——导出表结构,表数据,表序号
    (转)logback 打印Mybitis中的sql执行过程
    (转)PLSQL Developer导入Excel数据
    Linux时间设置
    (转)Oracle中的rownum,ROWID的 用法
  • 原文地址:https://www.cnblogs.com/z335/p/8178831.html
Copyright © 2011-2022 走看看