猿问

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

这是我当前的代码。我想知道如果已经同步,我是否需要包装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")

@VisibleForTesting

public EventTypes getState() {

    synchronized (lock) {

        return state;

    }

}


@GuardedBy("lock")

public boolean isObjectActive() {

    synchronized (lock) {

        return getState() == EventTypes.ACTIVE;

    }

}


慕码人8056858
浏览 103回答 1
1回答

慕工程0101907

[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(...);}
随时随地看视频慕课网APP

相关分类

Java
我要回答