我可以用sun.misc.Unsafe覆盖对象吗?

时间:2011-05-18 09:56:09

标签: java unsafe

如果他们是同一个类的实例,他们的大小是相同的,使用sun.misc.Unsafe?我可以覆盖一个obejct吗?

编辑: 通过“覆盖”我的意思是“删除”第一个对象,蚂蚁用第二个填充内存。有可能吗?

1 个答案:

答案 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(...)