如果我在同一个类上同步了两个方法,它们能够同时在同一对象上运行吗?例如:
class A {
public synchronized void methodA() {
//method A
}
public synchronized void methodB() {
// method B
}
}
我知道在两个不同的线程上无法在相同的对象上两次运行methodA()
,同样的情况也适用于methodB()
。
但是,当methodA()
仍然在运行时,我可以在不同的线程上运行methodB()
吗?(同一对象)
methodB()
是静态的时,obj.methodB()
与A.methodB()
是同义的。因此,是的,它们将会阻塞(在类的监视器上,而不是对象的)。 - NPE.class
对象上使用锁。所以如果你有一个类A,有一个静态同步方法static synchronized void m() {}
。然后一个线程调用了new A().m()
,它会获得new A()
对象上的锁。如果另一个线程调用A.m()
,它可以__毫不费力地进入该方法__,因为它所寻找的是A.class
对象上的锁,而此时__没有任何线程拥有这种类型的锁__。因此,即使你声明了方法是synchronized
的,它实际上也会被__两个不同的线程同时访问__。因此:__永远不要使用对象引用来调用静态方法__。 - Alex Semeniuk