如何将过时的synchronized锁升级,实现高效并发控制?

2026-04-11 10:449阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3034个文字,预计阅读时间需要13分钟。

如何将过时的synchronized锁升级,实现高效并发控制?

我们知道`synchronized`关键字可以实现线程安全,但你是否了解其背后的原理呢?今天我们就来探讨一下`synchronized`实现线程同步背后的原因,以及相关的锁优化策略。

我们都知道 synchronized 关键字能实现线程安全,但是你知道这背后的原理是什么吗?今天我们就来讲一讲 synchronized 实现线程同步背后的原因,以及相关的锁优化策略吧。

synchronized 背后的原理

synchronized 关键字经过编译之后,会在同步块的前后分别形成 monitorenter 和 monitorexit 这两个字节码指令,这两个字节码只需要一个指明一个要锁定或解锁的对象。如果 Java 程序中指明了对象参数,那么就用这个对象作为锁。

如果没有指定,那么就根据 synchronized 修饰的是实例方法还是类方法,去拿对应的对象实例或 Class 对象来作为锁对象。因此我们可以知道,synchronized 关键字实现线程同步的背后,其实是 Java 虚拟机规范对于 monitorenter 和 monitorexit 的定义。

在 Java 虚拟机规范对 monitorenter 和 monitorexit 的行为描述中,有两点需要特别注意。

  1. synchronized 同步块对同一条线程是可重入的,也就是不会出现自己把自己锁死的问题。
  2. 同步块在已进入的线程执行完之前,会阻塞后面其他线程的进入。

synchronized 关键字在 JDK1.6 版本之前,是通过操作系统的 Mutex Lock 来实现同步的。

阅读全文

本文共计3034个文字,预计阅读时间需要13分钟。

如何将过时的synchronized锁升级,实现高效并发控制?

我们知道`synchronized`关键字可以实现线程安全,但你是否了解其背后的原理呢?今天我们就来探讨一下`synchronized`实现线程同步背后的原因,以及相关的锁优化策略。

我们都知道 synchronized 关键字能实现线程安全,但是你知道这背后的原理是什么吗?今天我们就来讲一讲 synchronized 实现线程同步背后的原因,以及相关的锁优化策略吧。

synchronized 背后的原理

synchronized 关键字经过编译之后,会在同步块的前后分别形成 monitorenter 和 monitorexit 这两个字节码指令,这两个字节码只需要一个指明一个要锁定或解锁的对象。如果 Java 程序中指明了对象参数,那么就用这个对象作为锁。

如果没有指定,那么就根据 synchronized 修饰的是实例方法还是类方法,去拿对应的对象实例或 Class 对象来作为锁对象。因此我们可以知道,synchronized 关键字实现线程同步的背后,其实是 Java 虚拟机规范对于 monitorenter 和 monitorexit 的定义。

在 Java 虚拟机规范对 monitorenter 和 monitorexit 的行为描述中,有两点需要特别注意。

  1. synchronized 同步块对同一条线程是可重入的,也就是不会出现自己把自己锁死的问题。
  2. 同步块在已进入的线程执行完之前,会阻塞后面其他线程的进入。

synchronized 关键字在 JDK1.6 版本之前,是通过操作系统的 Mutex Lock 来实现同步的。

阅读全文