gpt4 book ai didi

java - 如果两个线程使用不同的监视器,它们是否可以在同一个对象上执行相同的同步代码块?

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

我是 Java 并发的新手,我正在努力更好地理解监视器。

假设我有一个对象,其方法采用某种引用参数并将该参数用作同步块(synchronized block)中的监视器:

class Entity() {
public void myMethod(Object monitor) {
synchronized(monitor) {
// critical stuff
}
}
}

如果两个线程使用不同的对象作为监视器,是否可以在同一实体上同时进入该部分?

final Entity myEntity = new Entity();
for (int i = 0; i < 3; i++) {
new Thread() {
public void run() {
// Can these all run concurrently?
myEntity.myMethod(new Object());
}
}.start();
}

如果我对监视器的理解正确,那么是的,所有线程都可以同时进入同步块(synchronized block),因为每个监视器都充当完全不同的互斥锁,并且没有线程知道该 block 中的其他线程。

很难找到这方面的文档,因为大多数教程似乎只使用“this”作为监视器。

最佳答案

Can two threads enter that section at the same time on the same entityif they use different objects for the monitor?

来自oracle tutorial可以阅读:

Every object has an intrinsic lock associated with it. By convention,a thread that needs exclusive and consistent access to an object'sfields has to acquire the object's intrinsic lock before accessingthem, and then release the intrinsic lock when it's done with them. Athread is said to own the intrinsic lock between the time it hasacquired the lock and released the lock. As long as a thread owns anintrinsic lock, no other thread can acquire the same lock. The otherthread will block when it attempts to acquire the lock.

这非正式地意味着可以使用任何 Java 对象同步。在单个对象实例上由子句 synchronized 包围的 block 将按顺序执行,由持有对象锁的线程执行 synchronized.

Can two threads enter that section at the same time on the same entityif they use different objects for the monitor?

是的,多个线程可以(并行地)执行用 synchronized 子句包裹的相同代码区域,只要这些线程中的每一个都使用不同的对象实例进行同步。

也可以使用 class 本身而不是它的实例进行同步:

 synchronized (SomeClass.class){
System.out.println("Hello World");
}

在这种情况下,所有在类 SomeClass 上使用子句 synchronized 的线程都必须在彼此之间同步

也可以在方法上使用子句 synchronized(例如, public synchronized void method2());对于非静态方法,被同步的对象将是该方法所属的对象,而对于静态方法(例如, public static synchronized void method1()) 将是该方法所属的类本身。

关于java - 如果两个线程使用不同的监视器,它们是否可以在同一个对象上执行相同的同步代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65259180/

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