它解释了Java并发原语的并发性,但在实践中,性能最佳的并发代码使用sun.misc.Unsafe
原语,它涉及CAS和直接内存条带指令。
此外,在推理并发代码时,我个人更喜欢使用围栏。
那么,JMM仍然适用于现代Java吗?
或者换句话说,JMM可以用于推理程序,通过sun.misc.Unsafe
方法同步吗?
答案 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是唯一安全的解决方案。