程序计数器-简介

注意:以下都是从网上转载过来的。如果有自己的想法,完全是猜测,不足为准。

 

1,简介

  比如你的电脑正在执行java的一个方法,解释器会将这个方法的字节码一行一行的翻译成机器码并执行,程序计数器记录下一条被执行指令的”地址”,这里的”地址”可以是一个本地指针,也可以是在方法字节码中相对于该方法起始指令的偏移量;程序计数器是线程私有的,比如(用最通俗的也是最不正经的话说)一个方法走到了指令的第5行,然后这个方法起了另外一个线程W去处理问题,在cpu面前,之前那个线程被挂起来了,新的线程W获得了时间片,开始执行,等这个线程W执行完了,之前的线程如果没有这个程序计数器的话,就不知道自己执行到哪了,应该是因为中间杀出来个程咬金W,或者执行代码的东西没法同时顾及这么多的线程,需要各个线程的程序计数器将他们串联起来,给这个执行代码的东西一个交代。

 

2,native的方法的程序计数器的值为undefined,native方法执行完成后,执行代码的东西怎么知道继续执行哪一条指令?

  在网上也没有找到能让我这个初学者一目了然的答案。

  但是诸多解释好像都在暗示:?native方法执行时,一定会另起一个线程执行这个native方法,且这个线程除了执行这个native方法,不会去干别的事情?

  参考:https://blog.csdn.net/TomyGuan/article/details/604673;这个总结下来就是:1,native方法,只能有一个线程访问,不能多个线程同时访问,要加synchronized static修饰;2,native方法对应的dll文件只能在一个线程中加载,且只能在主线程中加载,不能分散在子线程中加载;

  所以比如一个方法走到了指令的第5行,然后这个方法需要执行一个native方法,程序计数器不会由5变成undefined;而是会另起一个线程W执行这个native方法,然后这个线程W的程序计数器的值至始至终都是undefined,等这个线程W执行完native方法后,切换为之前的那个线程,因为之前的线程的程序计数器是5,所以就可以继续执行下面的指令了。而如果线程W执行过程中又起了另外一个线程X,等X执行完切换为W后,就不知道执行到哪儿了,因为W的程序计数器是undefined,我觉得这个是不可能发生的,因为,网上好像都在暗示我,线程W会规规矩矩的执行完这个native方法,不会中途去干别的事情。

  总结,我自己解释完,都有点很慌的感觉,只能说是不那么纠结了,等我越来越深入的了解相关的东西,再反过来看今天写的东西,也许会有一个确定的答案。

posted @ 2020-06-04 14:27  seeAll  阅读(563)  评论(1编辑  收藏  举报