gpt4 book ai didi

java - "Synchronized"后面发生了什么?

转载 作者:行者123 更新时间:2023-12-01 07:03:06 24 4
gpt4 key购买 nike

我了解到,要使程序线程安全,建议使用 synchronized方法或代码块。疑问是下面的代码片段如何使程序线程安全?幕后发生了什么?

public class MyCounter
{
private int count = 0; // count starts at zero

public synchronized void setCount(int amount)
{
count = amount;
}

public synchronized int getCount()
{
return count;
}
}

最佳答案

The doubt is how the below code snippet will make the program thread-safe?

这里的关键是每个java对象都有一个与之关联的隐式监视器,并且在任何时间点只有一个线程可以进入对象监视器,并且尝试进入该监视器的其他线程将排队进入设置或等待设置。

当线程尝试执行标记为“同步”的方法时,它应该在执行该方法中的代码之前获得“隐式监视器”的所有权。

在您的情况下,您有两种方法,并且都标记为同步。由于使用 synchronized 关键字,只有一个线程能够获取执行这些方法之一所需的对象监视器,因此在任何时候都只有一个线程可以执行这些 synchronized 方法,因此它们是线程安全的。

What is happening behind the scenes?

为了了解对象监视器、所有权、等待集和条目集如何协同工作,让我们看下图,它代表每个 java 对象唯一的隐式监视器。正如我们所看到的,有两个入口点来获取监视器,即从Entry Set或从Wait Set。在我们的讨论中,我们仅从 Entry Set 角度来看流程,并假设一个空的 Wait Set

Java monitor entry set wait set

当线程调用synchronized方法时,它被放置在条目集中。

  • 如果当前没有线程拥有监视器,并且条目集中没有其他线程在等待,则该线程将成为监视器的所有者并开始执行代码。这称为 Activity 线程。
  • 否则,如果有另一个线程拥有监视器,当前线程将被放置在 Entry set 中,并且必须与 中其他已存在的线程一起等待轮到它条目集,如果有的话。

当当前线程在条目集中等待时,

  • Activity 线程在执行完同步块(synchronized block)中的代码后将释放监视器。 (其他释放方式是通过 wait() 方法,我们在讨论中将忽略该方法)
  • 随后,由于监视器现在空闲,条目集中的线程将竞争获取监视器,其中一个将获得机会。

注意:如上所述,对于上述讨论,为了简单起见,我们假设 等待集中 中没有线程,以便让讨论切中要点。 Wait Set 通过 wait()notify() 调用出现。

我建议并且值得一看https://www.artima.com/insidejvm/ed2/threadsynchP.html有关监视器、入口设置和等待设置的更详细说明。

关于java - "Synchronized"后面发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35969256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com