它从Java并发原语的角度解释了并发性,但在实践中,性能最佳的并发代码使用sun.misc.Unsafe原语,这涉及到CAS和直接内存栅栏指令。
此外,就我个人而言,当在并发代码上进行推理时,我更喜欢使用栅栏而不是发生之前。
那么,JMM对现代Java仍然有效吗?
或者,换句话说,是否可以使用JMM对程序进行推理,通过sun.misc.Unsafe方法进行同步?
发布于 2016-03-10 04:40:53
那么,JMM对现代Java还有用吗?
不怎么有意思。
那么,JMM对现代Java仍然有效吗?
是,仍然有效
大多数java内存都是在幕后处理的,垃圾收集调用和手动内存操作很少使用,而且被认为是糟糕的设计。大多数人会告诉你,它仍然是有用的,因为可以做某些事情,比如本机内存分配或创建本机并发。
虽然JMM被支持并且有效,但是没有人真正使用它。为什么?使用sun.misc.Unsafe做这些类型的事情是不安全的。它是不安全代码的原因之一是因为实例从不被垃圾回收。(除非这是您想要的)。就像对线程使用易失性变量一样;它从来不会在本地缓存,而且会降低性能,并且很难编写。在非原子操作中可能会给你不同的结果!
使用围栏代码并没有错,但请考虑权衡一下。问问你自己,为什么你使用java而不是C?
简而言之,这可能对完成某些事情很有用,但这是不现实的,因为有其他方法可以做到这一点。(本机代码)
对于文斯的评论,我将添加以下内容:
volatile int i = 0;
public void foo() {
if (i == 0) i = i + 1;
}上面的代码本质上是不安全的,即使变量的声明是易失性的,意味着读和写都会被刷新到主存--这样的方法唯一安全的实现是这样的:
int i = 0;
public synchronized void foo() {
if (i == 0)
i = i + 1;
}那么你应该选择哪一个呢?如果您有多个线程根据字段的值修改该字段(例如,比较和设置),那么synchronized是唯一安全的解决方案。
https://stackoverflow.com/questions/35901552
复制相似问题