当线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
参考答案:
当线程进入一个对象的synchronized
方法时,它获得了该对象的内在锁(也称为监视器锁)。这意味着,只要这个线程没有退出该方法或释放锁,其他任何线程都无法进入该对象的任何其他synchronized
方法,因为它们也需要获得相同的锁。
但是,其他线程可以进入该对象的非synchronized
方法。非synchronized
方法不需要获取对象的锁,所以它们可以被多个线程同时调用,即使其他线程已经持有该对象的锁。
举个例子:
public class MyClass {
public synchronized void syncMethod() {
// 一些同步代码
}
public void nonSyncMethod() {
// 一些非同步代码
}
}
在这个例子中,如果一个线程调用了syncMethod()
并进入了该方法,那么其他线程将无法同时调用syncMethod()
,直到第一个线程退出该方法。但是,其他线程仍然可以调用nonSyncMethod()
,因为该方法不是同步的,不需要获取对象的锁。
需要注意的是,如果一个线程持有一个对象的锁,并尝试调用该对象的另一个synchronized
方法,它不需要重新获取锁,因为它已经持有该锁。但是,如果一个线程尝试进入一个由不同对象锁保护的synchronized
方法,那么它必须获取那个对象的锁,即使它已经持有另一个对象的锁。在Java中,每个对象都有自己的内在锁,锁是互斥的,一个线程不能同时持有两个不同对象的锁。