在
Java中以原子方式分配引用是什么意思?
>我明白了一个长双重的意思,就是:一个线程可以看到部分构造的数字,
>但是对于我不明白的对象,因为赋值并不意味着仅仅指向内存中的地址
那么如果Java中的引用分配不是原子的话,那可能是错的呢?
解决方法
这意味着你不会得到损坏的参考.假设你有以下类:
class MyClass { Object obj = null; }
在内存中,obj是一个空指针,通常它是一个整数,如0x00000000.那么假设在一个线程中你有一个任务:
this.obj = new Object();
假设在内存中分配了新的Object(),并且具有像0x12345678这样的指针.引用原子性确保当您从另一个线程检查obj时,您将具有空指针(0x00000000)或指向新对象的指针(0x12345678).但是,在任何情况下,您都可以获得部分分配的引用(如0x12340000),指向无处.
这可能看起来很明显,但是根据cpu架构和内存对齐方式,这样的问题可能会出现在像C这样的低级语言中.例如,如果您的指针未对齐并跨越缓存行,则可能不会同步更新.为了避免这种情况,Java虚拟机始终对齐指针,所以它们不会越过缓存行.
因此,Java引用非原子,当引用来自另一个线程的引用时,会得到不是在赋值之前或之后引用的对象,而是随机存储器位置(可能导致分段错误,已损坏)堆或任何其他灾难).