java 冻结对象_Java:最终字段冻结从最终字段可访问的对象

Does this mean that if I have a final

field in class A of type Class B,

which in turn have a final field of

type Integer,then final field freeze

for an instance of class A completes

only after the final field freeze for

b.c have already happened?

我想我会仔细地说,在这种情况下,最终的字段冻结意味着当你创建一个A的实例并安全地发布它,其他对象永远不会看到b或c的未初始化的值.

我也会说,当你在A中创建B的实例时,A中的其他初始化代码将永远不会看到c的未初始化值.

一个遇到真正问题的例子是例如一个包含一个(可变的)HashMap的类,只用于在构建过程中初始化:

public class DaysOfWeek {

private final Map daysOfWeek = new HashMap();

public DaysOfWeek() {

// prepopulate my map

daysOfWeek.put(0,"Sunday");

daysOfWeek.put(1,"Monday");

// etc

}

public String getDayName(int dayOfWeek) {

return daysOfWeek(dayOfWeek);

}

}

问题出在这里:假设这个对象被安全地发布,并且由于这里没有同步,其他线程调用getDayName()是否安全?答案是肯定的,因为最终的域冻结保证HashMap和一切都可以从它(这里只是字符串,但可以是任意复杂的对象)可以到达结构冻结. [如果你想在构建之后实际修改这个地图,那么你需要在读写上进行明确的同步.]这是一个lengthier blog探索这个主题,并检查一些有趣的回应的意见,像Brian Goetz这样的人.

btw我是refcard的作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值