zoukankan      html  css  js  c++  java
  • this指针逃逸问题

    this指针逃逸是指在构造函数返回之前,其他线程已经就持有了该对象的应用,产生的结果自然和预期可能会产生差异。
    常见的this指针逃逸,在并发编程实战一书中,作者指出:在构造函数中注册事件监听,在构造函数中启动新线程。
    由于注册事件,并没有用过,因此以线程为例说明问题。:

    public class TestEscape
    {
        private String name;
        
        public TestEscape(String name) throws InterruptedException
        {
    
            new Thread(new EscapeRunnable()).start();
    //        Thread.sleep(1); //增加构造函数的负责度,加长name初始化时间,否则在测试过程中,并没有发生其为null的情况
            this.name = name;
            
        }
        
        private class EscapeRunnable implements Runnable
        {
            @Override
            public void run()
            {
                System.out.println(name);
            }
        }
        
        public static void main(String[] args) throws InterruptedException
        {
            new TestEscape("woniu");
        }
    }


    解决办法是,不在线程中启动线程或者注册事件,将线程的启动在初始化完成后,再次进行启动。

    public class TestEscape
    {
        private String name;
        private Thread thread;
        
        public TestEscape(String name) throws InterruptedException
        {
    
            thread = new Thread(new EscapeRunnable());
            Thread.sleep(1); //增加构造函数的负责度,加长name初始化时间,否则在测试过程中,并没有发生其为null的情况
            this.name = name;
            
        }
        
        public void init()
        {
            thread.start();
        }
        
        private class EscapeRunnable implements Runnable
        {
            @Override
            public void run()
            {
                System.out.println(name);
            }
        }
        
        public static void main(String[] args) throws InterruptedException
        {
           //由于已经将构造函数初始化完成,其后调用的方法,均可以正常执行,与预期无差异。
            new TestEscape("woniu").init();
        }
    }
  • 相关阅读:
    C#中在AxWebBrowser控件注入JS脚本的方法
    C# 操作鼠标移动到指定的屏幕位置方法
    uvm的sequence
    uvm学习杂记
    形参和实参
    gvim中对变量的识别
    验证环境中的program为什么必须是automatic
    FIFO设计验证经验谈
    AMBA总线基础知识简介
    systemverilog中module与program的区别
  • 原文地址:https://www.cnblogs.com/woniu4/p/8315924.html
Copyright © 2011-2022 走看看