通过匿名类进行封闭对象转义的参考-java

2024-01-09

我正在阅读 Java 并发实践,下面的例子就是来自其中。我的问题是 这个引用转义是什么意思?会出现什么问题呢? 。 this 引用如何从 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;
    }
}

Edit :

我尝试过下面的例子

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

由于逃生物体构造不完整 该输出应 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。 即使在我的第二个示例中没有将 escaper 字段设为最终值,它也能工作!


在第一种形式中,事件侦听器对象注册到事件源在构造函数内,因此它在构造函数完成之前使自己(以及通过关联的“this”对象)可用于事件源。如果内部类对象逃逸,外部对象也会逃逸。

为什么这是个问题?一旦注册了事件监听器,事件源就可以随时调用其方法。想象一下事件源正在使用的线程开始调用事件侦听器方法。现在甚至可以在构造函数完成之前发生这种情况。

然而,由于可见性问题,这个问题比看起来更严重。即使您将注册作为构造函数执行的“最后一个操作”,仍然有可能看到部分构造的对象或处于无效状态的对象。如果没有正确的happens-before排序,根本就没有可见性保证。

声明它是最终的可以在订购之前发生(因此是第二种形式)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过匿名类进行封闭对象转义的参考-java 的相关文章

  • JavaEE 8 教程,在 hello1 项目上部署失败

    我正在尝试学习 Java EE 8 我遵循了官方指南https javaee github io tutorial https javaee github io tutorial 但我有这个问题 cargo maven2 plugin 1
  • 修复 JSLint“意外的‘this’。”错误?

    我试图让以下代码成为符合 jslint 标准 http jslint com 但我陷入以下两个错误 本来应该看到一个声明 结果却看到了一个块 and 意想不到的 这个 我应该对我的代码进行哪些更改才能使 JSLint 满意 var pvAc
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • 使用 Java 编程式 HTML 文档生成

    有谁知道如何在 Java 中以编程方式生成 HTMLDocument 对象 而不需要在外部生成字符串 然后使用 HTMLEditorKit read 来解析它 我问的两个原因 首先 我的 HTML 生成例程需要非常快 并且我认为将字符串解析
  • 使用 jdbc 程序连接到 Open Office odb 文件

    我编写了以下代码来连接到 OpenOffice db String db C Documents and Settings hkonakanchi Desktop Test odb Class forName org hsqldb jdbc
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何在 OpenAPI 3.0 中定义字节数组

    我正在将 API 从 Swagger 2 0 迁移到 OpenAPI 3 0 在 DTO 中 我有一个指定为字节数组的字段 Swagger 对 DTO 的定义 Job type object properties body type str
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • 如何在 AppEngine (GAE) 中进行数据库锁定?

    在 GAE 中 我有一个充满 一次性 的表 诸如 最后使用的序列号 之类的东西 这些东西并不真正属于其他表 它是一个简单的字符串键和字符串值对 我有一些代码来获取命名整数并递增它 如下所示 PersistenceCapable detach
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • Java的hashCode可以为不同的字符串产生相同的值吗?

    使用java的哈希码函数是否可以为不同的字符串提供相同的哈希码 或者如果可能的话 其可能性的 是多少 Java 哈希码是 32 位 它散列的可能字符串的数量是无限的 所以是的 会发生冲突 百分比是没有意义的 项目 字符串 的数量是无限的 而

随机推荐

  • 选择桌面+移动应用程序的技术堆栈

    我目前正在浏览网络以获取信息 目标是构建经典棋盘游戏的网络和移动版本 我们的想法是在桌面版本上拥有完整的功能和游戏 以及与之配套的精简的本机移动应用程序 这将允许用户玩游戏并更改一些设置 现在我已经习惯了为桌面构建 Web 应用程序 但我从
  • 如何在 Gerrit 中创建新的补丁集?

    我是 Gerrit 新手 希望在提交新更改时创建新补丁 我使用本指南设置 Gerrithttps review typo3 org Documentation install quick html https review typo3 or
  • Ninject 程序集与引用的程序集不匹配

    Setup ASP NET MVC3 忍者 v2 2 1 4 忍者 v3 0 0 15 Ninject MVC3 v3 0 0 6 Ninject Web Common v3 0 0 7 使用 NuGet 我的 UnitTest 项目引用
  • 如何在具有圆角的超级视图中翻转非全屏 UIView?

    我正在翻转 UIView 类似于天气应用程序的页面翻转 不过 视图不是全屏的 并且超级视图有圆角 问题在于 在翻转动画期间 超级视图的圆角被黑色填充到方角 这是我设置角的方法 self view layer cornerRadius 15
  • 如何使用 javascript/jquery 从 URL 中删除获取变量和文件名?

    我正在研究这个问题 但找不到针对此特定目的的任何可靠答案 假设我有一个网址 http mysite com stuff index php search my search http mysite com stuff index php s
  • Xamarin Android - 在发布模式下打印到应用程序输出

    打补丁一些崩溃 https stackoverflow com questions 24809580 noclassdeffounderror android support v7 internal view menu menubuilde
  • 没有物理设备的配置文件

    我在这个论坛和苹果开发者论坛上经常看到这个问题 我已经按照教程学习了 6 个多小时 我想要的只是添加该应用程序 以便我可以与朋友和家人一起测试它 我没有 iPhone 我有一台 Macbook Pro 和付费的开发者注册 当我选择通用 IO
  • 在 Django 中生成带有内联摘要的列表/报告

    我正在尝试编写一个视图 该视图将生成一个报告 显示我的库存系统中的所有项目 并在某个点提供摘要 顺便说一下 这个报告纯粹是一个 HTML 模板 就我而言 每个项目都是订单的一部分 一个订单可以有多个项目 我希望能够在每个订单结束后显示基于
  • CarrierWave:为所有版本化文件创建相同、唯一的文件名

    在详细介绍之前 我先切入主题 有没有人找到一种方法让 Carrierwave 将文件名称保存为时间戳或每个文件唯一的任意字符串 默认情况下 Carrierwave 将每个文件及其备用版本保存在其自己的目录中 以型号 ID 号命名 我不喜欢这
  • Neo4j - 将匹配应用于上一场比赛的每个结果

    情况 具有许多端点的图 每个端点都与主图有一个连接 该连接可能会穿越多个中间层节点 gt 关系 gt 节点在加入主图之前 每个连接的最终节点都有特定的属性 我有一个查询沿着这条路径走并找到最终连接到主图的节点 我有另一个查询返回端点节点的列
  • 多个 JQuery 不同表单选择器

    我有两种形式one and two 并且基于提交的表单 我想在逻辑末尾根据提交的值调用一个函数 我想知道是否可以将每个选择器作为数组索引 循环或属性或其他内容检索var tagsOrAnswerers 然后也许我可以将该参数传递给我将被调用
  • 带树枝的自定义表单字段模板

    我想在树枝中创建一个自定义模板来呈现表单字段 Example form row form field 这可以通过表单主题覆盖 block form row custom code endblock form row 我想做的是这样的 blo
  • 来自 JSON 字符串数组的 MarkLogic TDE Xpath 值

    我想构建一个 tde 其中包含一行 其中包含 id 和原始文档中数组的每个值 我为每个元素获取一行 但值为空并被忽略 似乎如果上下文设置为不是数组的任何内容 uri 可以工作 但当上下文是数组时则不会 除了简单的示例之外 我正在努力寻找 M
  • Clickonce - 在 DVD 上部署,带有离线安装程序

    我正在使用 VS 2010 但在 clickonce 部署时遇到问题 我的目标是在 DVD 上分发应用程序 以便没有互联网连接的用户能够安装它 因此它需要包含 NET Framework 3 5 客户端配置文件的完整安装程序 但是 我无法实
  • 带有 Select Widget 的 Django ModelForm - 使用 object.uid 作为默认选项值而不是 object.id

    我有一个继承自 ModelForm 的表单 如下所示 class ChildModel ModelForm class Meta model Documents fields secretdocs widgets secretdocs Se
  • SQL、PL-SQL 和 T-SQL 之间有什么区别?

    SQL PL SQL 和 T SQL 之间有什么区别 谁能解释一下这三者之间的区别 并提供每一个的相关使用场景 SQL 是一种用于操作关系数据的声明性语言 表 视图 结果集等 它或多或少是标准化的 几乎所有关系数据库管理系统都使用它 SQL
  • 无法将类型 IAsyncOperation 隐式转换为 StorageFile

    我的代码到底出了什么问题 private void BrowseButton Click object sender RoutedEventArgs e FileOpenPicker FilePicker new FileOpenPicke
  • 为什么应用程序和小部件之间没有引用?

    这是后续为什么应用程序会在 sys exit 命令之后显示 https stackoverflow com questions 15688889 why will the application show after sys exit co
  • Kubernetes 秘密真的是秘密吗?

    当我开发API服务器时 我需要向API服务器提供一些帐户信息 这些信息不应该向任何人显示 K8s针对这种情况推荐了secret 所以我就使用了 但我想知道这个秘密是否真的是秘密 Secret 只是 Base 64 编码 文本 而不是 加密
  • 通过匿名类进行封闭对象转义的参考-java

    我正在阅读 Java 并发实践 下面的例子就是来自其中 我的问题是 这个引用转义是什么意思 会出现什么问题呢 this 引用如何从 doSomething e 中转义 public class ThisEscape public ThisE