最近在看《Java并发编程实战》这本书的“3.2 发布与逸出”章节时,对“this”引用在对象构造方法中逸出问题的解决方法有点小疑惑。

书上是这么说的:

如果想在构造函数中注册一个事件监听器或启动线程,那么可以使用一个私有的构造函数和一个公共的工厂方法,从而避免不正确的构造过程。

代码:

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;

}

}

我的疑惑就是,为什么构造方法一定要声明成private?我觉得声明成public应该也没问题吧?

经过一番思考,想到一个场景,就是子类继承情况,如果构造方法声明成public,那么子类重载父类构造方法也是有可能引入“构造方法中“this”逸出问题”的吧?

不知道有没有大佬有别的更合理的理解,还请指导一下!

java this 逸出_Java并发编程——this逸出解决方法的思考相关推荐

  1. java 共享锁 独占锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家取排队本着先来 ...

  2. java 关闭守护线程_Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt...

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

  3. java程序使用异步总线_JAVA并发编程基础

    CPU核心 核心(Die)又称为内核,是CPU最重要的组成部分.CPU中心那块隆起的芯片就是核心,是由单晶硅以一定的生产工艺制造出来的,CPU所有的计算.接受/存储命令.处理数据都由核心执行.各种CP ...

  4. java线程本地变量_Java并发编程示例(九):本地线程变量的使用

    这篇文章主要介绍了Java并发编程示例(九):本地线程变量的使用,有时,我们更希望能在线程内单独使用,而不和其他使用同一对象启动的线程共享,Java并发接口提供了一种很清晰的机制来满足此需求,该机制称 ...

  5. java逸出_Java并发编程 - 对象的共享

    编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理.同步代码块和同步方法可以确保以原子的方式执行操作,同步还有另一个重要的方面:内存可见性. 可见性 为了确保多个线程之间对内存 ...

  6. java queue 线程安全_java并发编程之线程安全方法

    线程安全的实现方法,包含如下方式 一, 互斥同步 使用互斥锁的方式. 举个栗子 synchronized,最常用的同步实现方案, ReentrantLock,java并发包中工具,后续介绍. 互斥同步 ...

  7. java等待5秒_Java并发编程-主线程等待子线程解决方案

    主线程等待所有子线程执行完成之后,再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { System.ou ...

  8. java 对象 线程安全_JAVA并发编程学习:构造线程安全的对象

    设计线程安全的类 实例限制 当一个对象被另一个对象封装时,所有访问被被封装对象的代码路径就是全部可知的,这相比于让对象可被整个系统访问来说,更容易对代码路径进行分析.将数据封装在对象内部,把对数据的访 ...

  9. java 不可修改对象_Java并发编程(六)不可改变对象

    6. 不可改变对象 如果一个对象在创建后不可改变,那么就称之为不可改变对象.基于不可变对象被广泛接受为创建简单.可靠代码的有效策略. 不可变对象在并发程序中显得尤为重要.由于它们不能改变,所以他们不会 ...

  10. java futuretask 源码_java并发编程——FutureTask源码分析

    FutureTask的简单示例: FutureTask的应用场景,如果在当前线程中需要执行比较耗时的操作,但又不想阻塞当前线程时,可以把这些作业交给FutureTask,另开一个线程在后台完成,当当前 ...

最新文章

  1. 程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板
  2. [异常解决] android studio检测不到手机的解决办法——ADB驱动自己安装
  3. webstock php,workerman_connection
  4. 在linux上获得线程id的方法
  5. 问题:AttributeError: 'Tensor' object has no attribute 'creator'
  6. 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统
  7. jqgrid 列表条件查询的几步关键操作
  8. Keras版GCN源码解析
  9. 流畅的python 18章
  10. While(true)无限循环
  11. 为什么要进行前后端分离
  12. JavaWeb 之 Listener监听器及Session的钝化与活化
  13. 蓝湖(切图工具)插件的安装和使用
  14. 64位linux默认内存对齐,Linux内存初始化(汇编部分)
  15. JavaScript制作页面倒计时器
  16. iOS程序员如何成为编程高手,并以此创业
  17. 网格交易模型 股票网格交易 期货网格交易 策略开发
  18. caffe中HDF5层及数据生成
  19. 虚拟现实和增强现实技术_增强现实和虚拟现实在NBA中的作用
  20. 3070网卡驱动linux教程,Ubuntu 12.04下RT5370无线网卡驱动安装

热门文章

  1. 2019 CSP-J 游记(CQ LNBS考场 的退役之战)
  2. package.json简介
  3. ObjectARX反应器概述
  4. [pytorch] torch.cuda.FloatTensor报错
  5. python爬虫抓取链家租房数据
  6. 三体 读后思考-泰勒展开/维度打击/黑暗森林
  7. 帐套文件(*.mdf)无法复制,拷贝出现数据错误(循环冗余检查)帐套文件(*.mdf)无法复制,拷贝出现数据错误(循环冗余检查),sql附加823错误
  8. Linux第一个正式版本,你安装的第一个Linux系统是什么版本的,成功没有啊?
  9. iOS开发UI篇 -- UINagivationController
  10. python绘制3d动态模型_python+matplotlib库绘制数学3d模型分析图