JUC--线程运行原理
线程运行原理
在java中有三块用于存储数据的内存:栈、堆和方法区,其中方法区用来存储类加载后形成的字节码,堆用来存储引用类型的数据以及成员变量,而栈用来存储线程。
每个线程都有属于自己的线程栈,栈与栈之间互不影响。每个线程栈都有一个个栈帧组成,每个栈帧对应着一个方法,存储着该方法所需要的局部变量。
1 | public class TestFrame{ |
通过debug可以看到以上代码对应的栈结构
线程上下文切换
所谓线程的上下文切换指的是某个线程由占有CPU的状态变为不占有CPU的状态。发生线程上下文切换时需要保存当前线程运行的状态,会使用PC(程序计数器)保存当前线程运行的指令,除此之外还需要保存线程中的一些变量等信息,可见发生线程的上下文切换需要完成许多工作,因此频繁的发生线程上下文切换会影响系统性能,需要尽可能避免。
一般有以下原因会导致线程上下文切换:
- CPU时间片到
- 有更高优先级的线程到来
- 垃圾回收(发生垃圾回收时,所有工作线程都需要进入等待状态,让垃圾回收线程先工作,实际上可以归为第二种原因)
- 线程自己调用sleep,wait,join,lock等方法
第一二种情况取决于操作系统使用的调度算法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 dch'blog!