java 安全发布_java – 通过final进行安全发布

即使在经过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;

}

}

解决方法:

简单回顾一下,我认为你的代码代表了对EventSource源对象的“安全”发布,它可能会在不同的线程中向侦听器提供事件回调.保证在传递的safe.listener引用上运行的线程将看到完全初始化的侦听器字段.这不会进一步保证与调用onEvent或与对象状态的其他交互相关的其他同步问题.

您的代码保证的是,当SafeListener的构造函数在静态方法内返回引用时,侦听器字段将不会在未写入状态下被看到(即使没有显式同步).例如:假设线程A调用newInstance(),从而导致对侦听器字段的赋值.假设线程B能够取消引用侦听器字段.然后,即使没有任何其他同步,线程B也可以保证看到write listener = new EventListener()….如果该字段不是final,则不会得到该保证.有几种(其他)方式提供不同性能和可读性的保证(显式同步,使用原子引用,使用易失性).

标签:java

来源: https://codeday.me/bug/20190717/1483865.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值