文档章节

多线程对象的发布与泄露

dota神牛
 dota神牛
发布于 2017/03/31 16:44
字数 244
阅读 9
收藏 0

     有时候我们需要在其他地方引用某个类,这是需要将该类发布出来,以便可以在其他地方使用。但是在发布类的时候,很有可能会暴露了类的内部状态变量,破坏了封装性。

  • 暴露了内部状态变量。
    public List<String> getNames() {
         return this.names;
    }

     

  • 隐式This泄露。代码片段:
  • public class ThisEscape {
        public ThisEscape(EventSource source) {
            source.registerListener(
                    new EventListener() {
                        public void onEvent(Event e) {
                            doSomething(e);
                        }
                    });
        }
    }
  • 上面的代码问题在于Event listener包含了一个隐式的this应用,而EventLitener可能会被其他线程触发,而此时ThisEscap类还没有构造完成(只有在构造方法返回时,才能认为对象构建完成。),所以可能导致一些奇怪的问题。而安全的写法应该如下:
  • 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;
        }
    }

 

            

 

© 著作权归作者所有

上一篇: 线程封闭
dota神牛
粉丝 0
博文 31
码字总数 7728
作品 0
成都
私信 提问
Java关键字synchronized学习笔记

1、synchronized定义 Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。当两个并发线程访问同一个对象...

linin630
2015/01/26
0
0
不用锁,也能实现线程安全的缓存系统

真有这种操作 《java并发编程实战》第三章:发布对象 第二章主要介绍了什么是线程安全,以及怎么检测一个类到底是不是线程安全的,从一个实例引出线程不安全的情况,并且怎么用synchronized关...

aworker
2017/11/06
0
0
Android性能优化:关于 内存泄露 的知识都在这里了!

前言 在中,内存泄露的现象十分常见;而内存泄露导致的后果会使得应用 本文 全面介绍了内存泄露的本质、原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜欢。 目录 } Li...

Carson_Ho
2018/04/19
0
0
Go commons pool 1.0 发布,通用 Go 语言对象池

Go commons pool是一个通用的go语言对象池,基于Java版本的Apache Commons Pool改写。Go commons pool实现了Java版本的主要功能,改写了大多数Java版本的测试用例,测试覆盖率达到90%,性能测...

jolestar
2016/01/18
2.2K
11
多线程基础必要知识点!看了学习多线程事半功倍

前言 不小心就鸽了几天没有更新了,这个星期回家咯。在学校的日子要努力一点才行! 只有光头才能变强 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 本文章的知识主要参考《Java并...

Java3y
2018/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
1
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
2
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
5
0
拉普拉斯算子

拉普拉斯算子是二阶微分算子。 我们知道,一维离散信号一阶微分公式如下: 相应的,一维离散信号二阶微分公式如下: 由于图像有x和y两个方向,因此图像信号属于二维离散信号。其在x,y两个...

yepanl
昨天
3
0
记录"正则表达式"

详细请查看我的博客:https://blog.enjoytoshare.club/article/RegularExpression.html 1 写在前面 正则表达式(Regular Expression)在代码中常常简写为regex。正则表达式通常被用来检索、替...

wugenqiang
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部