this引用逃逸问题

//this引用逃逸
// 1.构造器还未完成前,将自身this引用向外抛,使其他线程访问这个引用,进而访问到其未初始化的变量,造成问题
// 2.内部类访问外部类未初始化的成员变量
//3.多态继承中,父类访问子类未初始化的成员变量
public class TestThisEscape {
    final int a;
    int b = 3;
    static TestThisEscape obj;
    public TestThisEscape(){
        a= 3;
        b= 5;
        //obj = new TestThisEscape();  //在构造器中很明显抛出引用会造成this引用逃逸
    }

    public static void main(String[] args) {
       Thread threadA =  new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("---------------");
                obj = new TestThisEscape();
                System.out.println("============");
            }
        },"threadA");

       Thread threadB =  new Thread(new Runnable() {
            @Override
            public void run() {
                TestThisEscape obj1 = obj;//obj未初始化完成,this引用被使用造成空指针一场
               // try {
                    System.out.println(obj1.a);
                //} catch (Exception e) {
                    System.out.println(Thread.currentThread().getName()+"     a变量未初始化");
                //}
                try {
                    System.out.println(obj1.b);
                } catch (Exception e) {
                    System.out.println(Thread.currentThread().getName()+"    b变量未初始化");
                }
            }
        },"threadB");
       threadA.start();
       threadB.start();
    }

}

  

/**
 * this逸出条件:1.构造函数中创建内部类。2.构造函数中将这个内部类的引用发布了出去
 */
public class TestInnerClassThisEscape {
    final int a;
    int b = 3;
    String c;
    static TestInnerClassThisEscape obj;
    public TestInnerClassThisEscape(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(TestInnerClassThisEscape.this.a);
                System.out.println(TestInnerClassThisEscape.this.b);
                System.out.println(TestInnerClassThisEscape.this.c);
            }
        }).start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        a= 3;
        b= 5;

    }

    public static void main(String[] args) {
        new TestInnerClassThisEscape();
    }

}
public class TestThisPC {
    public static void main(String[] args) {
       new Child();
    }
}
class Parent{
    Parent(){
        print();
    }
    void print(){
        System.out.println("----------");
    }
}


class Child extends Parent{
    int a = 5;
    void print(){
        System.out.println("-----------"+ a);
    }
     Child(){
        super();
        print();
    }
}

  

解决方案:
1.初始化在调用之前
posted @ 2019-05-27 19:37  叮叮007  阅读(475)  评论(0编辑  收藏  举报