【发布时间】:2014-09-05 19:44:12
【问题描述】:
瞬态对象是否可以避免双重检查锁定?
private transient java.lang.ThreadLocal __hashHistory;
public int hashCode() {
if (__hashHistory == null) {
synchronized (this) {
if (__hashHistory == null) {
__hashHistory = new java.lang.ThreadLocal();
}
}
}
或者对象需要是易失的?
【问题讨论】:
-
我看不出瞬态变量与双重检查锁定有何关系。如果应用了双重检查锁定,我相信 volatile 只是一种开销,因为您将实现一个同步块。所以 answer 是一个没有任何修饰符的私有变量就足够了。
-
我认为它可能相关的原因是因为我们之前的防御工事报告没有双重检查锁定问题,而且我知道这段代码在防御工事期间已经到位。因此,加强代码的前一个人找到了不去修复双重检查锁定问题的理由,或者他们当时没有意识到这是一个问题/当那个强化时它没有被认为是一个问题发生(大约 6 年前)。
-
也许transient关键字被放在那里是为了序列化,这不会以任何方式影响双重检查锁定过程。
-
@RamiStefanidis 没有
volatile,synchronized块是不够的。阅读:jeremymanson.blogspot.com/2008/05/double-checked-locking.html