2-2 Java 多线程相关概念

主要内容是:

  • 1 把锁
  • 2 个并
  • 3 个程

1 把锁

指 synchronized 锁

2 个并

并发

  1. 是在同一实体上的多个事件
  2. 是在一台处理器上“同时”处理多个任务
  3. 同一时刻,其实是只有一个事件在发生

并行

  1. 是在不同实体上的多个事件
  2. 是在多台处理器上同时处理多个任务
  3. 同一时刻,大家真的都在做事情,各自独立,彼此不干涉

并发 vs 并行

image

3 个程

进程

简单的说,在系统中运行的一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源。

线程

也被称为轻量级进程,在同一个进程内会有 1 个或多个线程,是大多数操作系统进行时序调度的基本单元

管程

俗称 monitor(监视器),就是平时所说的锁。

Monitor 其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码。

JVM 中同步是基于进入和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个 Monitor 对象,比如下面所示的 Object o,就是所谓的锁

Object o = new Object();
new Thread(() -> {
    synchronized (o) {

    }
}, "t2").start();

monitor 对象会和 Java 对象一同创建并销毁,它底层是由 c++ 语言来实现的

JVM(第三版)内容:

Java 虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor,更常见的是直接将它称为“锁”)来实现的。

方法级的同步是隐式的,无须通过字节码指令来控制,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池中的方法表结构中的 ACC_SYNCHRONIZED 访问标志得知一个方法是否被声明为同步方法。

当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程就要求先成功持有管程,然后才能执行方法,最后当方法完成(无论是正常完成还是非正常完成)时释放管程

在方法执行期间,执行线程持有了管程,其他任何线程都无法再获取到同一个管程。如果一个同步方法执行期间抛出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的管程将在异常抛到同步方法边界之外时自动释放。

posted @ 2023-03-27 13:25  ShaunY  阅读(12)  评论(0编辑  收藏  举报