Java使用synchronized关键字进行锁

标签 java synchronize

我在教程中看到了这个,他们询问以下代码是否有问题。对我来说,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/

相关文章:

javascript - 如何在javascript中同步调用一组函数

java - 是否同步 PoolingClientConnectionManager

java - 确定 Apache POI 中是否需要 HSSF 还是 XSSF 的最佳方法是什么?

java - 使用Hibernate Lazy Fetchtype时如何加载一组对象?

java - 通过套接字连接发送数据库数据

iOS NSUserDefaults 同步完成前的访问

android - 使用 2 个进程处理数据库

java - AVD 模拟器未在 Eclipse 中启动

java - 使用这个快捷方式会导致问题吗?

java - 在 eclipse.ini 中定义 --launcher.XXMaxPermSize 后,Eclipse 无法创建 JVM