首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java内存模型还在使用吗?

Java内存模型还在使用吗?
EN

Stack Overflow用户
提问于 2016-03-10 04:06:48
回答 1查看 176关注 0票数 0

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

此外,就我个人而言,当在并发代码上进行推理时,我更喜欢使用栅栏而不是发生之前。

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

或者,换句话说,是否可以使用JMM对程序进行推理,通过sun.misc.Unsafe方法进行同步?

EN

回答 1

Stack Overflow用户

发布于 2016-03-10 04:40:53

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

不怎么有意思。

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

是,仍然有效

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

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

使用围栏代码并没有错,但请考虑权衡一下。问问你自己,为什么你使用java而不是C?

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

对于文斯的评论,我将添加以下内容:

代码语言:javascript
复制
volatile int i = 0;

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

上面的代码本质上是不安全的,即使变量的声明是易失性的,意味着读和写都会被刷新到主存--这样的方法唯一安全的实现是这样的:

代码语言:javascript
复制
int i = 0;

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

那么你应该选择哪一个呢?如果您有多个线程根据字段的值修改该字段(例如,比较和设置),那么synchronized是唯一安全的解决方案。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35901552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档