文档章节

不可变对象

dota神牛
 dota神牛
发布于 2017/04/11 14:52
字数 261
阅读 5
收藏 0

   绕开同步的另外一种方法就是使用不可变对象。因为不可变对象的状态在构造之后无法改变,所以不可变是天然线程安全的。

   虽然java语言规范和内存模型没有为不可变性给出明确的定义,但其不等同于将所有属性定义为final。判断一个对象是否可变可依据如下:

  • 除了构造方法,没有其他地方可以改变其状态。
  • 所有属性都是final(这条不是必须的,典型的列子就是String, 它 是不可变对象,但是它的hashcode不是final,而是延迟到第一次调用hashcode方法才产生,但是要实现这点要求对java内存模型非常熟悉,一般建议将所有属性定义为final。)
  • 正确的被构建(不存在this泄露)。

简单列子:

public final class ThreeStooges {
    private final Set<String> stooges = new HashSet<String>();
    public ThreeStooges() {
        stooges.add("Moe");
        stooges.add("Larry");
        stooges.add("Curly");
    }
    public boolean isStooge(String name) {
        return stooges.contains(name);
    }
}

 

© 著作权归作者所有

dota神牛
粉丝 0
博文 31
码字总数 7728
作品 0
成都
私信 提问

暂无文章

如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
23分钟前
0
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
31分钟前
1
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
39分钟前
0
0
想说再见不容易,win7最新市占率依然超36%

微软正在通过努力让Windows 7用户升级至Windows 10,不过从目前的市占率来看,他们还是要加把劲了。 据最新的市场份额看,Windows 10在本月的市场份额有所提升,从43.62%增长到44.10%。另一...

linuxCool
50分钟前
4
0
SQL的优化

对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建了索引。 应尽量避...

咸鱼-李y
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部