跳到主要内容

简述当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法 ?

参考答案:

当一个线程进入一个对象的 synchronized 实例方法后,其他线程对于该对象的访问行为会受到一定的影响。具体来说,其他线程是否可以进入此对象的其他方法,取决于这些方法的同步状态。

  1. 其他非同步方法:如果其他线程试图访问该对象的非同步方法(即没有使用 synchronized 关键字的方法),那么它们是可以进入的。因为非同步方法不会获得对象的监视器锁(monitor lock),所以它们不会受到同步方法的阻塞。

  2. 其他同步方法

    • 如果其他线程试图访问该对象的另一个同步方法,那么它们会被阻塞,直到第一个线程释放了对象的监视器锁。这是因为同步方法在执行时会先尝试获取对象的监视器锁。如果锁已经被其他线程持有,则当前线程会进入等待状态,直到锁被释放。
    • 如果第二个同步方法使用的是与第一个方法相同的锁对象(通常是 this),则第二个方法会被阻塞。
    • 如果第二个同步方法使用的是不同的锁对象,那么它可能会并行执行,这取决于锁的获取和释放情况。
  3. 静态同步方法:如果对象的同步方法是静态的(例如 synchronized static void method()),那么它将锁定类的 Class 对象,而不是对象的实例。在这种情况下,其他线程可以访问该对象的非静态同步方法或非同步方法,但不能同时访问该类的其他静态同步方法。

总之,当一个线程进入某个对象的 synchronized 实例方法后,其他线程仍然可以访问该对象的非同步方法。但对于其他同步方法,是否能进入取决于它们是否使用相同的锁对象。