这是我当前的代码。我想知道如果已经同步,我是否需要包装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(...);
}
添加回答
举报
0/150
提交
取消