java - transient 对象是否可以免受双重检查锁定的影响?

标签 java object transient

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/

相关文章:

java - 如何将属性值与字符串进行比较

javascript - 将对象数组推送到数组进行排序

javascript - 无法创建对象数组

iphone - 即使定义了依赖键,我是否也必须手动更新 transient 属性?

scala - Scala 的 transient 集合?

java - 在 JDBC 中插入单引号以进行 SQL 查询不起作用

java - Android:如何存储用户位置并稍后在服务器端 Web 应用程序中显示用户走过的路线

java - XML 中的 TestNG 值集

python - 使用循环将对象添加到列表(python)