2014-09-05 66 views
0

临时对象是否可以安全地进行双重检查锁定?瞬态对象是否可以安全地进行双重检查锁定?

private transient java.lang.ThreadLocal __hashHistory; 
public int hashCode() { 
    if (__hashHistory == null) { 
     synchronized (this) { 
      if (__hashHistory == null) { 
       __hashHistory = new java.lang.ThreadLocal(); 
      } 
     } 
    } 

或者该对象是否需要变化?

+1

我不明白瞬态变量如何与双重检查锁定相关。如果应用双重检查锁定,我相信volatile将只是一个开销,因为您将实现一个同步块。所以答案是没有任何修饰符的私有变量就足够了。 – 2014-09-05 19:51:22

+0

我认为这可能与之相关的原因是因为我们以前的防御工事报告没有重复检查锁定问题,而且我知道这段代码在该防御工事期间已经到位。因此,无论是前一个强化代码的人发现某种原因,都不打算解决双重检查的锁定问题,或者他们没有意识到这是当时的问题/在设防时没有被识别为问题发生(大约6年前)。 – Zibbobz 2014-09-05 20:01:19

+0

也许transient序列关键字被放置在那里用于序列化目的,这不会以任何方式影响双重检查的锁定过程。 – 2014-09-05 20:07:40

回答

3

transient表示该字段在序列化过程中应该被忽略。这个关键字与线程锁定无关,因此一切都像安全或不安全一样。我不确定volatile会有帮助。

在您的代码中,如果__hashHistory == null,两个线程可能会同时接近​​语句。他们将逐一传递同步声明的主体,但仍会创建两个ThreadLocal。这就是为什么双重检查锁定被认为是反模式的原因:要正确判断是非常困难的。

+1

它可以在“新”内存模型下使用'volatile'。代码唯一的问题是在一个公开可见的对象上进行同步。 – biziclop 2014-09-05 19:55:27

相关问题