理解不了 AtomicInteger成员变量value, 为什么在类初始化时, 就能获取到成员变量value的内存地址?

来源:3-1 线程安全性-原子性-atomic-1

慕娘1997375

2018-11-23

我们这样使用
AtomicInteger count = new AtomicInteger(0);
当执行 new AtomicInteger(0)时, 遇到new字节码指令时, 如果类没有进行过初始化, 则需要先触发其初始化。初始化阶段是执行类构造器clinit()方法, 类构造器clinit()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。

static {
	try {
	    valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}

这段代码会执行, 但是value是成员变量, 它的内存地址应该是在AtomicInteger count对象上面, 放在堆内存里面, 现在 count 对象还没有生成, 又怎么能通过 unsafe.objectFieldOffset 方法返回成员属性在内存中的地址相对于对象内存地址的偏移量呢?

写回答

1回答

Jimin

2018-11-23

你好 ,不知道你是否学习到单例的线程安全性那里,那里简单介绍了一下实例化对象的过程:

1、memory = allocate() 分配对象的内存空间
2、ctorInstance() 初始化对象
3、instance = memory 设置instance指向刚分配的内存

实例化对象分多步,第一步是先分配内存空间,之后才会初始化对象,因此实际初始化对象时可以肯定已经有确定的内存地址了。

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程