繁体   English   中英

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

[英]Thread-safe comparison of an enum value in Java

这是我当前的代码。 我想了解如果getState()已经同步,是否需要将isObjectActive()包装在一个同步块中?

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")
@VisibleForTesting
public EventTypes getState() {
    synchronized (lock) {
        return state;
    }
}

@GuardedBy("lock")
public boolean isObjectActive() {
    synchronized (lock) {
        return getState() == EventTypes.ACTIVE;
    }
}

[我需要将isObjectActive()包装在一个同步块中吗?

没有。

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

@Thomas在他对您的问题的评论中指出了一个要点:您可能应该考虑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(...);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM