我在实践中阅读

Java并发性,下面的例子来自于此.我的问题是

这个参考逃脱是什么意思?会有什么问题? .这个引用是如何从doSomething(e)中逃脱的.

public class ThisEscape {

public ThisEscape(EventSource source) {

source.registerListener(

new EventListener() {

public void onEvent(Event e) {

doSomething(e);

}

}

);

}

}

这是如何解决这个问题的

public class SafeListener {

private final EventListener listener;

private SafeListener() {

listener = new EventListener() {

public void onEvent(Event e) {

doSomething(e);

}

};

}

public static SafeListener newInstance(EventSource source) {

SafeListener safe = new SafeListener();

source.registerListener(safe.listener);

return safe;

}

}

编辑:

我试过以下的例子

public class Escape {

public Escape( Printer printer ){

printer.print(new Escaper(){

@Override

public void parentData(){

theCulprit1(Escape.this);

}

public String name = "shal";

@Override

public void theCulprit(){

System.out.println( this.name );

System.out.println( Escape.this.age );

}

});

canAccess();

}

public void canAccess(){

this.age = "25";

}

public String age = "62";

@SuppressWarnings("unused")

public static void main(String args[]){

Escape escape = new Escape(new Printer());

}

}

class Printer{

public void print(Escaper escaper){

escaper.theCulprit();

escaper.parentData();

}

}

class Escaper{

public void parentData(){

}

public void theCulprit(){

}

public void theCulprit1(Escape escape){

System.out.println(escape.age);

}

}

由于逃生物体的构造不完整

这输出shal

62

62

我在哪里改变了我的代码

public class Escape {

private final Escaper escaper;

private Escape( ){

escaper = new Escaper(){

@Override

public void parentData(){

theCulprit1(Escape.this);

}

public String name = "shal";

public void theCulprit(){

System.out.println( name );

System.out.println( age );

}

};

canAccess();

}

public void canAccess(){

age = "25";

}

public String age = "62";

public static Escape newInstance( Printer printer){

Escape escape = new Escape();

printer.print(escape.escaper);

return escape;

}

@SuppressWarnings("unused")

public static void main(String args[]){

Escape.newInstance(new Printer());

}

}

在这里.它输出shal

25

25

我对吗 ?

还有任何重新排序的操作,因为在第一个例子中,年龄被初始化为62.

即使没有在我的第二个例子中进行自由竞技场决赛,它仍然有效!

java 匿名对象有引用,封闭对象的引用通过匿名类java进行转义相关推荐

  1. java里面有控制器吗_java怎么运行控制器里的类 java控制台输入类以及

    import java.io.*; public class Input { static InputStreamReader isr=new InputStreamReader(System.in) ...

  2. java任何封闭实例都不是java_《java并发编程实战》读书笔记3--对象的组合

    希望将一些现有的线程安全组件组合为更大规模的组件或程序 设计线程安全的类 如果对象中所有的域是基本类型变量,那么这些域将构成对象的全部状态.例如,LinkedList的状态就包括该链表中所有节点对象的 ...

  3. Java IO流大闯关--IO流的常用实现类

    这个系列的博客主要是对Java高级编程中IO流相关的知识点做一个梳理,内容主要包括File类.IO流原理及流的分类.文件流.缓冲流.转换流.标准输入输出流.打印流.数据流.对象流.随机存取文件流.NI ...

  4. Java 并发编程(二)对象的发布逸出和线程封闭

    对象的发布与逸出 "发布(Publish)"一个对象是指使对象能够在当前作用域之外的代码中使用.可以通过 公有静态变量,非私有方法,构造方法内隐含引用 三种方式. 如果对象构造完成 ...

  5. java多态性详解——父类引用子类对象

    Java的多态性 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作 ...

  6. java中四种引用类型(对象的强、软、弱和虚引用)

    2019独角兽企业重金招聘Python工程师标准>>> 对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  7. java中对象清空值_对象的引用和清除_Java语言程

    对象的引用和清除_Java语言程 4.3.3 对象的引用和清除 在创建了类的对象后,就可以使用对象.即对象使用的原则是"先创建后使用". 使用对象的方法是:通过运算符". ...

  8. 通过链表深入理解Java的引用和对象

    在正式介绍重点内容以前,先给像我这样的初学者强调一下 " = " 在引用和对象应用中的作用: 大致是 " = " 左边是引用," = " 右 ...

  9. Java通过引用操作对象的“共享”特性

    先来理解一下引用和对象的关系:对于任何引用类型直接创建的变量都是一个引用,这个引用指向这个类型的对象,数据是存在对象中的,对数据的操作实质是通过引用找到对应的对象,在对对象中的数据进行操作. 而题目中 ...

最新文章

  1. 20181029NOIP模拟赛T2
  2. JDK源码解析-Runtime类
  3. 阮一峰react demo代码研究的学习笔记 - how is source code converted
  4. 《构建之法》 读书笔记
  5. slider节点透明背景_【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)...
  6. java图的拓扑排序,本周算法:图的拓扑排序,本周算法拓扑排序
  7. docker-compose搭建EFK,继上篇使用filebeat+es对日志文件的过滤
  8. solidity 0.5.7简明教程
  9. C#程序之快速切换IP地址
  10. ubuntu18.04: 安装nanomsg
  11. 饥荒联机版服务器搭建_饥荒联机版(Don't Starve Together)专用服务器搭建教程
  12. Django 项目编码问题1UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd2 in position 0: invalid contin
  13. 结合阿里云 FC 谈谈我对 FaaS 的理解
  14. SparkStreaming读取Kafka数据源并写入Mysql数据库
  15. 电机磁电热多场耦合 matlab,永磁电机电磁-温度场耦合仿真分析流程
  16. Cesium之地图清晰度解决方案
  17. cuda无法使用nvprof命令,找不到cupti64_2021_3.0.dll
  18. virtual box 安装oracle linux,Virtual Box下安装Oracle Linux 6.3
  19. H5项目中通过iframe引入语音导览解决微信jsapi关于同一级域名二级域名跨域问题解决方案
  20. Oracle建表及添加数据

热门文章

  1. TDMA 时分多路复用
  2. gprs连接中断记录_请收好!脉搏波血压计连接天天血压APP使用指南
  3. MATLAB库函数unwrap(相位解卷绕)的C语言实现
  4. AI+遥感智能解译,赋能智慧城市规划革新(人工智能案例)
  5. MySQL在哪里看secret_key_K8S 创建和查看secret(九)
  6. 1到10用递归c语言,为什么这个递归能输出1到10
  7. Testner自动化测试平台免费开放啦
  8. How to make a difference
  9. RegularExpressionValidator 常用
  10. java DOM4J 读取XML