我对同步行为(静态和非静态方法)感到困惑。
例如:
1
class MyClass {
...
public synchronized static someMethod() {
...
}
public static someMethod2() {
...
}
...
}
因此,如果线程A调用someMethod1(),线程B是否锁定someMethod2()?
2
class MyClass {
...
public synchronized someMethod() {
...
}
public someMethod2() {
...
}
...
}
如果我们有MyClass a = new MyClass(),线程A调用方法someMethod(),线程是否锁定someMethod2()?
答案 0 :(得分:1)
两者的答案都是否定的。同步是一种合作机制。在实例或类上进行同步不会阻止其他线程调用另一个方法,除非该方法也在同一监视器上同步。
答案 1 :(得分:0)
在您的两个问题中,答案是No
:线程B不会被锁定在方法someMethod2
上,因为此方法未同步。
仅当两个线程都将调用someMethod
时,同步和相关锁才会起作用。
这种情况的唯一区别是将被锁定的目标。 synchronized方法使用方法接收器作为锁(即this
用于非静态方法,而封闭类用于静态方法)
答案 2 :(得分:0)
不,在这些情况下,另一种方法可以自由锁定。当另一个线程锁定类的非静态方法时,线程可以获取静态方法的锁。这些方法有不同的监视器。
当静态方法同步时,它会在类上同步。这意味着在执行静态方法时,整个类都被阻止。因此其他静态同步方法也被阻止。在其他情况下,当非静态方法同步时,它在实例上同步。仅阻止此特定对象的所有同步方法。