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;
        }
    }

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

  • 相关阅读:
    Azure产品目录
    AWS产品目录
    BD
    Cloud Resource
    do-release-upgrade升级笔记
    Gluster vs Ceph:开源存储领域的正面较量
    OpenStack大规模部署详解
    SECURITY ONION:防御领域的kali
    vue非父子组件间传参问题
    vue源码之响应式数据
  • 原文地址:https://www.cnblogs.com/lishuaiqi/p/11795525.html
Copyright © 2011-2022 走看看