考虑“延迟初始化实例字段的双重检查成语”。
// Item 71 in Effective Java copied from this interview with Bloch. private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { // First check (no locking) synchronized(this) { result = field; if (result == null) // Second check (with locking) field = result = computeFieldValue(); } } return result; }
我想以安全的方式重置该字段(在我的情况下,强制它再次从数据库加载)。我认为我们可以通过拥有一个重置方法来实现这一点:
void reset() { field = null; }
这是否是重置字段的标准方法?它安全吗?有什么问题吗?我之所以问这个问题,是因为Bloch对于double-checked lazy-loading发出了以下警告:“这个习惯用法非常快速,但也很复杂和微妙,所以不要试图以任何方式修改它。只需复制和粘贴--通常不是一个好主意,但在这里很合适。”
Thanks in advance, Playa from the Himalayas.