如果他们是同一个类的实例,他们的大小是相同的,使用sun.misc.Unsafe?我可以覆盖一个obejct吗?
编辑: 通过“覆盖”我的意思是“删除”第一个对象,蚂蚁用第二个填充内存。有可能吗?
答案 0 :(得分:9)
通过“覆盖”我的意思是“删除”第一个对象,蚂蚁来填充内存 与第二个。有可能吗?
是和否。
是 - 如果您使用Unsafe分配一些内存并写一个long,然后在其中写另一个长(例如),然后是,您删除了第一个对象并填写带有第二个对象的内存。这类似于使用ByteBuffer可以执行的操作。当然,long是一种原始类型,所以它可能不是你所说的'对象'。
Java允许这样做,因为它可以控制已分配的内存。
否 - Java使用对象的引用,仅提供对这些对象的引用。此外,它倾向于在存储器中移动对象(即,用于垃圾收集)。
如果您正在尝试,则无法获取“物理地址”并将内存内容从一个对象地址移动到另一个对象地址。此外,您实际上无法“删除”该对象,因为它可能会从代码中的其他位置引用。
但是,始终有可能将{A}指向另一个objectB,而不是带有A = objectB;
的objectA。您甚至可以使用Unsafe.compareAndSwapObject(...)
创建此原子。
解决方法 - 现在,让我们假设引用A1,A2,A3指向同一个objectA。如果你想让所有人突然指向objectB,你就不能使用Unsafe.compareAndSwapObject(...)
,因为只有A1会指向objectB,而A2和A3仍会指向objectA。它不会是原子的。
有一种解决方法:
public class AtomicReferenceChange {
public static Object myReference = new Object();
public static void changeObject(Object newObject) {
myReference = newObject;
}
public static void main(String[] args) {
System.out.println(AtomicReferenceChange.myReference);
AtomicReferenceChange.changeObject("333");
System.out.println(AtomicReferenceChange.myReference);
}
}
您可以定义公共静态引用,并使代码在任何地方都使用AtomicReferenceChange.myReference
,而不是对同一个对象进行多次引用。如果要以原子方式更改引用的对象,请使用静态方法changeObject(...)
。