这是否修改了双重检查锁定的问题?
双重检查锁定背后的理论是完美的。
这就是“双重检查锁定”名称的由来。
双重检查锁定:获取两个。
然而,这并不意味着应该在这些实例中使用双重检查锁定。
However, this does not mean you should use double-checked locking in these instances.
这些事实将导致代码失败,原因是双重检查锁定难于跟踪。
These facts make a code failure due to double-checked locking very difficult to track down.
然而,此对象的构造函数尚未运行,这恰是破坏双重检查锁定的情况。
However, the constructor for this object has not run yet, which is precisely the situation that breaks double-checked locking.
然而,这并不意味着应该在这些实例中使用双重检查锁定。
However, this does not mean you should use double -checked locking in these instances.
尽管如此,即使是在新提议的内存模型中,双重检查锁定也是无效的。
However, even under the newly proposed memory model, double-checked locking will not work.
在本文余下的部分里,我们将详细介绍双重检查锁定习语,从而理解它在何处失效。
In the remainder of this article, we'll examine the double-checked locking idiom in detail to understand just where it breaks down.
JIT编译器的这一行为使双重检查锁定的问题只不过是一次学术实践而已。
The fact that JIT compilers do just this makes the issues of double-checked locking more than simply an academic exercise.
在新的内存模型中,对双重检查锁定的这个“修复”使 idiom 线程安全。
Under the new memory model, this "fix" to double-checked locking renders the idiom thread-safe.
有关双重检查锁定的问题和对为什么所建议的算法修复不能解决问题的说明请参阅参考资料。
See Resources for a description of the double-checked locking problem and an an explanation of why the proposed algorithmic fixes don't work.
要理解双重检查锁定习语是从哪里起源的,就必须理解通用单例创建习语,如清单1中的阐释?
To understand where the double-checked locking idiom originated, you must understand the common singleton creation idiom, which is illustrated in Listing 1.
对双重检查锁定问题提出的一种修复是使包含迟缓初始化的实例的字段为一个volatile字段。
One of the proposed fixes to the double-checked locking problem was to make the field that holds the lazily initialized instance a volatile field.
如果此代码在执行c 3行后且在完成该构造函数前被另一个线程中断,则双重检查锁定就会失败。
If this code is interrupted by another thread after executing line C3 but before completing the constructor, double-checked locking fails.
JSR- 133是有关内存模型寻址问题的,尽管如此,新的内存模型也不会支持双重检查锁定。
JSR-133 is addressing issues regarding the memory model, however, double-checked locking will not be supported by the new memory model. Therefore, you have two options.
所以如果双重检查锁定的目标是提供比更直观的同步方式更好的性能,那么这个“修复的”版本也没有多大帮助。
So if the goal of double-checked locking is supposed to offer improved performance over a more straightforward synchronized approach, this "fixed" version doesn't help very much either.
无论以何种形式,都不应使用双重检查锁定,因为您不能保证它在任何JVM实现上都能顺利运行。
The bottom line is that double-checked locking, in whatever form, should not be used because you cannot guarantee that it will work on any JVM implementation.
但是,volatile的新语义允许通常所提出的其中一个双重检查锁定的可选方法正确地工作,尽管我们不鼓励这种技术。
However, the new semantics of volatile allow one of the commonly proposed alternatives to double-checked locking to work correctly, although the technique is still discouraged.
考虑到当前的双重检查锁定不起作用,我加入了另一个版本的代码,如清单7所示,从而防止您刚才看到的无序写入问题。
Given that the current double-checked locking code does not work, I've put together another version of the code, shown in Listing 7, to try to prevent the out-of-order write problem you just saw.
不使用双重检查锁定,而使用Initialize - on - demandHolderClassidiom,它提供了迟缓初始化,是线程安全的,而且比双重检查锁定更快且没那么混乱。
Instead of double-checked locking, use the Initialize-on-demand Holder Class idiom, which provides lazy initialization, is thread-safe, and is faster and less confusing than double-checked locking.
不使用双重检查锁定,而使用Initialize - on - demandHolderClassidiom,它提供了迟缓初始化,是线程安全的,而且比双重检查锁定更快且没那么混乱。
Instead of double-checked locking, use the Initialize-on-demand Holder Class idiom, which provides lazy initialization, is thread-safe, and is faster and less confusing than double-checked locking.
应用推荐