程序计数器(PC Register)是线程私有的,因为每个线程必须独立记录当前执行的字节码指令地址,以保障线程切换后能准确恢复执行位置、避免执行逻辑错乱、天然无竞争且零成本安全、内存极小且不会OOM。
程序计数器(PC Register)之所以被设计为线程私有,核心就一点:每个线程必须独立记住自己执行到了哪条字节码指令。没有这个隔离,多线程根本无法正确切换和续跑。
JVM靠时间片轮转实现多线程并发。比如线程A执行到第42条字节码时被暂停,CPU转去执行线程B;等再轮回到A,JVM得知道从哪继续——这个“哪”,就存在它自己的PC里。如果多个线程共用一个PC,A刚存好地址,B一写就覆盖掉了,恢复时必然错乱。
每个线程只读写自己的PC,不存在多个线程同时修改同一内存地址的情况。所以既不需要加锁,也不涉及可见性或原子性问题——这是线程私有带来的“零成本”并发安全。
PC不是堆、栈这类可动态伸缩的区域。它只是JVM对CPU寄存器行为的抽象: