Java并发-满老师

Java并发

  • Java并发
    • 栈与栈帧
    • 线程上下文切换
    • 线程安全
      • 静态变量线程安全
      • 局部变量线程安全
      • 常见线程安全类

Java并发

栈与栈帧

满老师视频链接
我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存

  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
    Java并发-满老师_第1张图片

线程上下文切换

因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码

  • 线程的 cpu 时间片用完
  • 垃圾回收
  • 有更高优先级的线程需要运行
  • 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法

当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的

  • 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等
  • Context Switch 频繁发生会影响性能
    Java并发-满老师_第2张图片

线程安全

静态变量线程安全

static int counter = 0;
public static void main(String[] args) throws InterruptedException {
.....

}

Java 中对静态变量的自增,自减并不是原子操作,
Java并发-满老师_第3张图片Java并发-满老师_第4张图片
成员变量和静态变量是否线程安全?
如果它们没有共享,则线程安全
如果它们被共享了,根据它们的状态是否能够改变,又分两种情况

  • 如果只有读操作,则线程安全
  • 如果有读写操作,则这段代码是临界区,需要考虑线程安全

Java并发-满老师_第5张图片

局部变量线程安全

局部变量是否线程安全?
Java并发-满老师_第6张图片
Java并发-满老师_第7张图片
Java并发-满老师_第8张图片

常见线程安全类

String
Integer
StringBuffer
Random
Vector
Hashtable
java.util.concurrent 包下的类
这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的
无成员变量的类(无状态)
String、Integer 等都是不可变类,因为其内部的状态不可以改变,因此它们的方法都是线程安全的

你可能感兴趣的:(java,开发语言)