

一、先来看看概念
多线程的Java应用程序:为了让每个线程正常工作就提出了程序计数器(Programe Counter Register),每个线程都有自己的程序计数器这样当线程执行切换的时候就可以在上次执行的基础上继续执行,仅仅从一条线程线性执行的角度而言,代码是一条一条的往下执行的,这个时候就是程序计数器;JVM就是通过读取程序计数器的值来决定下一条需要执行的字节码指令,进而进行选择语句、循环、异常处理等;
这个还没看懂的话不要紧,继续往下走咯。
二、作用:
PC寄存器用来存储指向下一条指令的地址,也即将要执行指令的代码。由执行引擎读取下一条指令。
程序计数器特点:
1.它占用很小的内存空间,几乎可以忽略不计。也是运行速度最快的内存区域。
2.每个线程都有他自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
3.任何时间一个线程都只有一个方法执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的java方法的JVM指令地址;如果是在执行native方法,则是未指定值(undefined)
疑点解答:
这里的“pc寄存器”是在抽象的JVM层面上的概念——当执行Java方法时,这个抽象的“pc寄存器”存的是Java字节码的地址。实现上可能有两种形式,一种是相对该方法字节码开始处的偏移量,叫做bytecode index,简称bci;另一种是该Java字节码指令在内存里的地址,叫做bytecode pointer,简称bcp。
对native方法而言,它的方法体并不是由Java字节码构成的,自然无法应用上述的“Java字节码地址”的概念。所以JVM规范规定,如果当前执行的方法是native的,那么pc寄存器的值未定义——是什么值都可以。
上面是JVM规范所定义的抽象概念,那么实际实现呢?
Java线程总是需要以某种形式映射到OS线程上。映射模型可以是1:1(原生线程模型)、n:1(绿色线程 / 用户态线程模型)、m:n(混合模型)。
以HotSpot VM的实现为例,它目前在大多数平台上都使用1:1模型,也就是每个Java线程都直接映射到一个OS线程(操作系统线程)上执行。此时,native方法就由原生平台直接执行,并不需要理会抽象的JVM层面上的“pc寄存器”概念——原生的CPU上真正的PC寄存器是怎样就是怎样。就像一个用C或C++写的多线程程序,它在线程切换的时候是怎样的,Java的native方法也就是怎样的。
三、JVM程序计数器的总结
程序计数器作用不多说了,我个人感觉他是为了多线程而生的,单线程情况下完全不需要他。从案例中不难发现,程序计数器是每个线程独有的,并非线程共享的,所以是线程安全的!
对于一些抽象不好理解的问题,我们要学会具体化,学会结合一些生活工作中一些例子,能够通俗易懂的讲解给别人听!
江湖险恶,我从来不轻易留下我的姓名----周星驰
本文深入解析了Java多线程环境下程序计数器(Program Counter Register)的作用和特性,阐述了其如何帮助线程切换时保存和恢复执行状态,确保线程安全。并探讨了程序计数器在执行Java方法与native方法时的不同表现。

3575

被折叠的 条评论
为什么被折叠?



