加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 什么时候引用需要是原子的?

发布时间:2020-12-14 05:06:53 所属栏目:Java 来源:网络整理
导读:在 Java中以原子方式分配引用是什么意思? 我明白了一个长双重的意思,就是:一个线程可以看到部分构造的数字, 但是对于我不明白的对象,因为赋值并不意味着仅仅指向内存中的地址 那么如果Java中的引用分配不是原子的话,那可能是错的呢? 解决方法 这意味着你
在 Java中以原子方式分配引用是什么意思?

>我明白了一个长双重的意思,就是:一个线程可以看到部分构造的数字,
>但是对于我不明白的对象,因为赋值并不意味着仅仅指向内存中的地址

那么如果Java中的引用分配不是原子的话,那可能是错的呢?

解决方法

这意味着你不会得到损坏的参考.假设你有以下类:
class MyClass {
    Object obj = null;
}

在内存中,obj是一个空指针,通常它是一个整数,如0x00000000.那么假设在一个线程中你有一个任务:

this.obj = new Object();

假设在内存中分配了新的Object(),并且具有像0x12345678这样的指针.引用原子性确保当您从另一个线程检查obj时,您将具有空指针(0x00000000)或指向新对象的指针(0x12345678).但是,在任何情况下,您都可以获得部分分配的引用(如0x12340000),指向无处.

这可能看起来很明显,但是根据CPU架构和内存对齐方式,这样的问题可能会出现在像C这样的低级语言中.例如,如果您的指针未对齐并跨越缓存行,则可能不会同步更新.为了避免这种情况,Java虚拟机始终对齐指针,所以它们不会越过缓存行.

因此,Java引用非原子,当引用来自另一个线程的引用时,会得到不是在赋值之前或之后引用的对象,而是随机存储器位置(可能导致分段错误,已损坏)堆或任何其他灾难).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读