gpt4 book ai didi

Java使用synchronized关键字进行锁

转载 作者:行者123 更新时间:2023-12-01 22:32:24 25 4
gpt4 key购买 nike

我在教程中看到了这个,他们询问以下代码是否有问题。对我来说,b() 似乎无法访问,因为 a() 已经控制了监视器。我这样想对吗?

public class Test {
public synchronized void a() {
b();
System.out.println("I am at a");
}
public synchronized void b() {
System.out.println("I am at b");
}
}

最佳答案

不,该代码没有问题。注意两点:

  1. 同步 SomeType foo() { ... } 相当于

    SomeType foo() {
    synchronized (this) { ... }
    }

    它锁定封闭类的 this 实例。因此,在您的情况下 a()b() 锁定相同的东西

  2. 如果一个线程已经持有某个对象的监视器上的锁,它会阻止另一个线程获取同一对象上的锁,但同一线程如果需要也可以获取更多锁,这不受影响。所以

    public synchronized void a() {  // acquires lock on this
    b(); // also aquires lock on this, but it's ok because it is the same thread
    System.out.println("I am at a");
    }

    当线程位于 a() 内部时,其他线程将无法调用 a()b()同一个实例。如果他们尝试这样做,他们将不得不等待,直到当前线程退出 a()。但当前线程本身不受影响,它可以调用此对象上的任何同步方法,因为它已经持有锁。

关于Java使用synchronized关键字进行锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465648/

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