transient 对象是否可以免受双重检查锁定的影响?
private transient java.lang.ThreadLocal __hashHistory;
public int hashCode() {
if (__hashHistory == null) {
synchronized (this) {
if (__hashHistory == null) {
__hashHistory = new java.lang.ThreadLocal();
}
}
}
或者对象是否需要是 volatile 的?
最佳答案
transient
表示该字段在序列化期间应被忽略。该关键字与线程锁定无关,因此一切都与没有它时一样安全或不安全。我不确定 volatile
是否会有帮助。
在您的代码中,如果__hashHistory == null
,则两个线程可能同时接近synchronized
语句。它们将一一传递同步语句的主体,但仍然会创建两个 ThreadLocal。这就是为什么双重检查锁定被认为是反模式的原因:很难做到正确。
关于java - transient 对象是否可以免受双重检查锁定的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692942/