1.1. 为什么程序计数器、虚拟机栈和本地方法栈是线程私有的?为什么堆和方法区是线程共享的呢?

  • 程序计数器为什么是私有的?
    • 程序计数器有以下作用:
      • 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
      • 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
        (所以,程序计数器私有主要是为了线程切换后能恢复到正确的执行位置)。
  • 虚拟机栈和本地方法栈为什么是私有的?
    • 虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在Java虚拟机栈中入栈和出栈的过程。
    • 本地方法栈:和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
      (所以)为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的
  • 堆和方法区是所有线程共享的资源
    • 堆是进程中最大的一块内存,主要用于存放新创建的对象(所有对象都在这分配内存)
    • 方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译后的代码数据

1.2. Java线程的状态

初始状态、运行状态、阻塞状态、等待状态、超时等待状态、终止状态。 线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换

  • 线程创建后处于初始状态(New),调用start()方法后开始运行,线程这时候处于可运行状态(READY)
  • 可运行状态的线程获得了CPU时间片后就处于运行状态(RUNNING)
  • 当线程执行wait()方法之后,线程进入等待状态(WAITING),进入等待状态的线程需要依靠其他线程的通知才能返回到运行状态(notify() )。而超时等待状态(TIME_WAITING)相当于在等待的基础上增加了超时限制,【sleep(long millis)/wait(long millis)】,当超时时间到达后java线程将会返回到运行状态。
Copyright & copy lviter@163.com            updated 2024-02-06 09:54:55

results matching ""

    No results matching ""