Java内存模型是否仍在使用?

时间:2016-03-09 20:06:48

标签: java concurrency java-memory-model

它解释了Java并发原语的并发性,但在实践中,性能最佳的并发代码使用sun.misc.Unsafe原语,它涉及CAS和直接内存条带指令。

此外,在推理并发代码时,我个人更喜欢使用围栏。

那么,JMM仍然适用于现代Java吗?

或者换句话说,JMM可以用于推理程序,通过sun.misc.Unsafe方法同步吗?

1 个答案:

答案 0 :(得分:-1)

那么,JMM对现代Java仍有用吗?

不是。

那么,JMM仍然适用于现代Java吗?

是的,仍然有效

大多数java内存都是在场景后面处理的,垃圾收集调用和手动内存操作很少使用并被认为是糟糕的设计。大多数人会告诉你,由于可以完成某些事情,例如本机内存分配或创建本机并发,它仍然有用。

虽然JMM受支持且有效,但没有人真正使用它。为什么?使用sun.misc.Unsafe完成这些类型的事情是不安全的。它是不安全代码的一个原因是因为实例永远不会被垃圾收集。 (除非这是你想要的)。就像在线程中使用volatile变量一样;它永远不会在本地缓存,它会降低您的性能并且难以编写。在非原子操作中可能会给你不同的结果!

使用fence代码并没有错,但考虑权衡。问问自己为什么使用java而不是C?

简而言之,完成某些事情可能很有用,但这是不切实际的,因为有其他方法可以做到这一点。 (本地代码)

对于Vince的评论,我将补充一下:

volatile int i = 0;

public void foo() { 
    if (i == 0) i = i + 1;
}

上面的代码本质上是不安全的,即使变量的声明是volatile也意味着读取和写入被刷新到主内存 - 这种方法的唯一安全实现是这样的:

int i = 0;

public synchronized void foo() {
    if (i == 0) 
    i = i + 1;
}

那你更喜欢哪个?好吧,如果你有多个线程修改依赖于该字段值的字段(即比较和设置),那么synchronized是唯一安全的解决方案。