为了账号安全,请及时绑定邮箱和手机立即绑定

Java 中枚举值的线程安全比较

Java 中枚举值的线程安全比较

慕码人8056858 2023-06-21 13:53:20
这是我当前的代码。我想知道如果已经同步,我是否需要包装isObjectActive()在同步块中?getState()private final Object lock = new Object();@GuardedBy("lock")private EventTypes state;@GuardedBy("lock")public void setState(final EventTypes state) {    synchronized (lock) {        this.state = state;    }}@GuardedBy("lock")@VisibleForTestingpublic EventTypes getState() {    synchronized (lock) {        return state;    }}@GuardedBy("lock")public boolean isObjectActive() {    synchronized (lock) {        return getState() == EventTypes.ACTIVE;    }}
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

[Do] 我需要将 isObjectActive() 包装在同步块中......?


不。


同步不是针对方法的,而是针对数据的。在上面显示的示例中,您可以synchronized从 中删除块isObjectActive(),因为该函数不直接访问state变量,并且它调用的唯一其他函数在访问 时确实使用同步state。

你可能应该考虑一下调用的结果意味着什么,isObjectActive()如果其他线程的操作可以在调用者有机会之前改变对象的状态根据结果采取行动:


MyType mt = ...;


if (mt.isObjectActive()) {

    // This is broken because there's no guarantee that mt still will be "active"

    // by the time doSomething...() gets called.

    //

    doSomethingThatOnlyMakesSenseWhen_mt_IsActive(...);

}


查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信