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

猜你在找的Java相关文章