gpt4 book ai didi

java - 任意时刻有多少个线程可以访问该 Java 对象的同步代码?

转载 作者:行者123 更新时间:2023-12-01 23:16:53 24 4
gpt4 key购买 nike

假设有以下类:

public class MyClass {
public synchronized void methodA() {
//...code
}
public synchronized void methodB() {
//...code
}
public synchronized void methodC() {
//...code
}
}

假设 MyClass 的同步方法没有互相调用。

我是否正确地假设 1 个且只有 1 个线程可以在任何给定时间访问 MyClass 的任何代码?例如,如果一个线程正在 MyClass 的实例上执行 methodA(),我假设此时没有其他线程可以调用 methodB() 或 methodC(),但会阻塞,直到该线程执行 methodA() 为止。第一个线程已完成。

我想澄清我对 Goetz 的《Java 并发实践 (28)》的理解,Goetz 指出:

“获取与对象关联的锁不会阻止其他线程访问该对象 - 获取锁阻止任何其他线程执行的唯一操作就是获取同一锁。”

在这个特殊情况下,我认为戈茨的第一个陈述是不正确的。 MyClass 在其 3 个方法中的每一个上都采用隐式锁定——对于每个方法,隐式锁定是其本身(this)。因此,在这种情况下,如果一个线程在执行 methodA() 时持有隐式锁,则所有其他线程将被阻止访问该对象上的任何代码。

我是否正确理解方法同步和隐式锁定?

非常感谢任何观点!

最佳答案

"Acquiring the lock associated with an object does not prevent other threads from accessing that object--the only thing that acquiring a lock prevents any other thread from doing is acquiring that same lock."

您的三个方法被声明为同步。当调用这些方法之一时,例如

MyClass instance = new MyClass();
instance.methodA();

当前正在执行的线程(称之为A)将获取该实例的监视器。在 A 释放该对象之前,其他线程都无法获取该对象的监视器。没有什么可以阻止其他线程调用同一对象上的方法。

假设你有线程 A 在做

instance.methodA();

线程 B 正在做

instance.methodB();

然后,是的,线程 B 必须等待 methodA 完成(即线程 A 释放 instance 引用的对象上的锁)。

但是,如果线程 A 正在执行

instance.methodA();

线程 B 正在做

instance.toString();

线程 B 根本不必等待,因为 toString() 对对象的监视器不执行任何操作。

关于java - 任意时刻有多少个线程可以访问该 Java 对象的同步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21081333/

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