美文网首页java多线程编程
java多线程编程三-线程启动、停止与可见性

java多线程编程三-线程启动、停止与可见性

作者: 李2牛 | 来源:发表于2018-04-19 01:54 被阅读0次

    启动时可见性

    Java 语言规范规定:父线程在子线程启动前对共享变量的更新对子线程是可见的。
    代码:

    /**
     * @author: kent
     * @date: 2018/4/18 21:43
     */
    public class ThreadStartVisibility {
        static int data = 0;
    
        public static void main(String[] args){
            Thread thread = new Thread(){
                @Override
                public void run(){
                    Tools.randomPause(50);
    
                    System.out.println(data);
                }
            };
    
            data = 1;//第一次更新
            thread.start();
    
            Tools.randomPause(50);
            data = 2 ;//第二次更新
        }
    }
    
    

    这里如果将第二次更新注释掉得到的输出将是 1,但是如果不注释掉得到的将是 1 或者 2,因为 1 的赋值在子线程启动前。

    终止可见性

    JLS 保证一个线程终止后该线程对共享变量的更新对于调用该线程的join方法的线程是可见的

    
    /**
     * @author: kent
     * @date: 2018/4/19 01:44
     */
    public class ThreadJoinVisibility {
        static int data = 0;
        public static void main(String[] args){
            Thread thread = new Thread(() -> {
                Tools.randomPause(50);
                data  = 1;
            });
            thread.start();
            
            //子线程结束之后才能继续运行main线程
            try{
                thread.join();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(data);
        }
    }
    

    输出结果为1,因为子线程将data赋值之后结束,data对main线程可见

    相关文章

      网友评论

        本文标题:java多线程编程三-线程启动、停止与可见性

        本文链接:https://www.haomeiwen.com/subject/gtgbkftx.html