[英]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.