Java并发整理

进程和线程

  • 进程是程序的一次执行过程,是系统运行程序的基本单位
  • 线程是比进程更小的单位。同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。一个 Java 程序的运行是 main 线程和多个其他线程同时运行。

进程和线程(JVM内存角度)

  • 一个进程中可以有多个线程,多个线程共享进程的方法区(JDK1.8后的元空间),但每个线程有自己的程序计数器虚拟机栈和本地方法栈
  • 程序计数器为什么私有?

    • 程序计数器的作用:1.代码流程控制;2.记录当前线程执行位置。
    • 程序计数器私有主要是为了线程切换后能恢复到正确的执行位置
  • 虚拟机栈和本地方法栈为什么私有?

    • 虚拟机栈:方法在执行时创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息

    • 本地方法栈:与虚拟机栈非常类似,区别:虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

    • 为了保证线程中局部变量不被别的线程访问到,虚拟机栈和本地方法栈都是线程私有的。

  • 堆和方法区
    • 堆:线程共享。进程中最大的一块内存,用于存放所有新创建的对象
    • 方法区:线程共享。主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

并发与并行

  • 并发:同一时间段,多个任务都在执行(单位时间内不一定同时执行)(一个人吃两个包子)
  • 并行:单位时间内,多个任务同时执行(两个人吃两个包子)
  • Java是基于并发的

为什么使用多线程?多线程潜在问题?

  • 线程可以比作轻量级进程,线程间切换和调度的成本低
  • 系统对并发量要求越来越高,多线程并发编程是开发高并发系统的基础
  • 在单核以及多核时代,提高CPU的利用率
  • 可能遇到的问题:内存泄露、上下文切换、死锁还有受限于软硬件的资源浪费问题

线程的生命周期

  • 线程的6种状态:

  • 线程创建后处于NEW(新建)状态,调用start()方法后开始运行,处于READY(可运行)状态,可运行状态的线程获得了CPU时间片(timeslice)后处于RUNNABLE(运行中)状态。当线程执行wait()方法后,线程进入WAITING(等待)状态。进入等待状态的线程需要依靠其他线程的通知才能返回运行状态,而TIME_WAITING(超时等待)状态有超时限制,如通过sleep(long millis)方法或wait(long millis)方法,当到达指定时间时线程将返回RUNNABLE状态。当线程调用同步方法synchronized,且没有获取到锁时,线程会进入BLOCKED(阻塞)状态。线程在执行Runnable的run()方法后会进入TERMINATED(终止)状态。

0%