zoukankan      html  css  js  c++  java
  • this引用逸出

    1.定义

    public class UnsafeClass {
        
        public UnsafeClass(Button button) {
            button.addActionListener(new ActionListener() {
                //在这里发布  会导致this引用逸出,因为构造函数没有完全返回
                //如果在这里新建新的线程,那么新线程会持有没有完全构造完成的this引用
                @Override
                public void actionPerformed(ActionEvent e) {
                    
                }
            });
        }
    }

    如上述代码所示,在构造函数中定义新的线程或者发布会导致this引用逸出,此时的问题就在于构造函数还没有构造完成.

    2.解决

    public class SafeClass {
        private final ActionListener actionListener;
        private SafeClass() {
            actionListener = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                }
            };
        }
        public SafeClass newInstance(Button button) {
            //构造函数构造完毕在进行发布
            SafeClass safeClass = new SafeClass();
            button.addActionListener(safeClass.actionListener);
            return safeClass;
        }
    }

    发布this没有问题,只要在构造函数返回时进行发布就可以了.

    public class SafeClass {
        private final Runnable runnable;
        private SafeClass() {
            runnable = new Runnable() {
                
                @Override
                public void run() {
                }
            };
            
        }
        public SafeClass newInstance(Thread d) {
            //构造函数构造完毕在进行发布
            SafeClass safeClass = new SafeClass();
            d = new Thread(safeClass.runnable);
            return safeClass;
        }
    }

    线程的版本也可以这样写,只要保证构造函数构造完毕即可.

  • 相关阅读:
    icmp隧道手工操作
    Volatility2.4以上版本及fmem使用指南
    服务器解析漏洞总结
    Docker搭建独立服务器
    shell--(二)变量、字符串、数组、注释
    shell--(一)运行示例
    mysql 批量更新,没有就插入
    go 系统监控 cpu、内存等指标
    监控
    maven安装配置 每次都百度,麻烦
  • 原文地址:https://www.cnblogs.com/lishuaiqi/p/11795525.html
Copyright © 2011-2022 走看看