//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.初始化在调用之前
原文:https://www.cnblogs.com/htkj/p/10932649.html