简述当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法 ?
参考答案:
当一个线程进入一个对象的 synchronized
实例方法后,其他线程对于该对象的访问行为会受到一定的影响。具体来说,其他线程是否可以进入此对象的其他方法,取决于这些方法的同步状态。
-
其他非同步方法:如果其他线程试图访问该对象的非同步方法(即没有使用
synchronized
关键字的方法),那么它们是可以进入的。因为非同步方法不会获得对象的监视器锁(monitor lock),所以它们不会受到同步方法的阻塞。 -
其他同步方法:
- 如果其他线程试图访问该对象的另一个同步方法,那么它们会被阻塞,直到第一个线程释放了对象的监视器锁。这是因为同步方法在执行时会先尝试获取对象的监视器锁。如果锁已经被其他线程持有,则当前线程会进入等待状态,直到锁被释放。
- 如果第二个同步方法使用的是与第一个方法相同的锁对象(通常是
this
),则第二个方法会被阻塞。 - 如果第二个同步方法使用的是不同的锁对象,那么它可能会并行执行,这取决于锁的获取和释放情况。
-
静态同步方法:如果对象的同步方法是静态的(例如
synchronized static void method()
),那么它将锁定类的Class
对象,而不是对象的实例。在这种情况下,其他线程可以访问该对象的非静态同步方法或非同步方法,但不能同时访问该类的其他静态同步方法。
总之,当一个线程进入某个对象的 synchronized
实例方法后,其他线程仍然可以访问该对象的非同步方法。但对于其他同步方法,是否能进入取决于它们是否使用相同的锁对象。