//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.初始化在调用之前

this引用逃逸问题的更多相关文章

  1. this引用逃逸

    1.什么是This逃逸? 在构造器构造还未彻底完成前(即实例初始化阶段还未完成),将自身this引用向外抛出并被其他线程复制(访问)了该引用,可能会问到该还未被初始化的变量,甚至可能会造成更大严重的问 ...

  2. this引用逃逸(使用内部类获取未外部类未初始化完的变量),多态父类使用子类未初始化完的变量

    1,this引用逃逸 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了. 这是危及到线程安全的,因为其他线程有可能 ...

  3. 你不知道的Java引用

    什么是引用   引用就是保存着一块地址(门牌号)的对象,就像C语言的指针那样,引用可以传递某个数据的地址,如果我们想拿到某一条数据,就要先找到他的地址,然后告诉计算机我去拿这个地址的数据,最后计算机就 ...

  4. 浅析java内存模型--JMM(Java Memory Model)

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  5. java并发编程(十七)内存操作总结

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则, ...

  6. Java的线程安全

    线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别 ...

  7. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  8. Java的内存模型

    "让计算机并发执行若干个运算任务"与"更充分地利用计算机处理器的效能"之间的因果关系,看起来顺理成章,实际上它们之间的关系并没有想象中的那么简单,其中一个重要的 ...

  9. 转《深入理解Java虚拟机》学习笔记之最后总结

    编译器 Java是编译型语言,按照编译的时期不同,编译器可分为: 前端编译器:其实叫编译器的前端更合适些,它把*.java文件转变成*.class文件,如Sun的Javac.Eclipse JDT中的 ...

随机推荐

  1. 取三级分销上下级用户id

    //取上三级的用户idpublic function _get_up_third_id($member_id){ $up_id=array(); $invite_id=dbselect('invite ...

  2. 基于jquery的常见函数封装

    /// <reference path="jquery-1.8.0.min.js" />/** DIV或元素居中* @return*/jQuery.fn.mCenter ...

  3. 洛谷——P1896 [SCOI2005]互不侵犯

    P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...

  4. NOIp知识点复习——最短路计数

    $Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...

  5. 小实例 hangman game

    代码 #include <bits/stdc++.h> using namespace std; int bk[110]; string sj(int t) { string ans=&q ...

  6. Master Nginx(7) - Nginx for the Developer

    Caching integration No application caching Caching in the database Caching in the filesystem Changin ...

  7. [网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]

    将网格分为两部分,方法是黑白染色,即判断(i+j)&1即可,分开后从白色格子向黑色格子连边,每个点需要四条(边界点可能更少),也就是每个格子周围的四个方向.之后将源点和汇点分别于黑白格子连边, ...

  8. Method and apparatus for speculative execution of uncontended lock instructions

    A method and apparatus for executing lock instructions speculatively in an out-of-order processor ar ...

  9. linux 各命令字 练习

    ===============================================================                                     ...

  10. P - How many

    Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...