Java Synchronized 如何工作?

10 Sept 2024 | 4 分钟阅读

Java 多线程允许程序中的多个线程并发运行。但是,当多个线程使用相同资源时,可能会出现数据不一致和竞争条件等问题。Java 提供了同步技术来解决这些问题。

Synchronized 关键字

Java 同步的一个重要组成部分是 synchronized 关键字。它可用于代码块和方法中,以控制多少线程可以访问共享资源。

同步方法

标记为 synchronized 的方法一次只能被该特定类实例的一个线程使用。

SynchronizedExample.java

输出

Count Value: 200

同步代码块

在同步方面,Java 的 synchronized 块比同步整个方法提供了更大的灵活性。我们可以选择哪些代码块需要以原子方式运行,并同步它们,而不是整个过程。由于只有必要的代码段被同步,因此可以提高性能,减少线程争夺锁的时间。

Synchronized 块的优点

  1. 细粒度控制:通过允许您仅同步关键代码段,synchronized 块减少了线程被锁定的时间。
  2. 降低争用:通过仅同步方法中必要的代码段,我们可以通过减少锁的争用来提高并发性和速度。
  3. 防止死锁:通过允许线程更早地释放锁并降低循环依赖的可能性,synchronized 块可以帮助防止死锁。

SynchronizedExample.java

输出

Count Value: 200

解释

此示例中的重要部分位于一个使用锁作为其监视器的 synchronized 块内。

内置锁和重入同步

在 Java 中,每个对象都有一个内置锁,有时也称为监视器。使用此锁来同步对对象的方法或代码块的访问。线程在开始执行同步方法或进入 synchronized 块之前,需要获取与该 synchronized 方法或块关联的对象的内置锁。

线程重新获取它已拥有的锁的能力称为重入同步。Java 允许持有对象内置锁的线程在不被阻止的情况下进入由该锁保护的任何 synchronized 方法或代码块。

SynchronizedLock.java

输出

Count Value: 0

解释

在这种情况下,increment 方法在调用另一个 synchronized 函数 increment 时保持锁。

结论

理解 Java 同步对于创建并发和线程安全的程序至关重要。在多线程环境中,synchronized 关键字在应用于块或方法时,有助于管理对共享资源的访问,防止竞争条件和数据不一致。