根据我的理解,在非静态方法上同步将在对象级别被阻止静态方法上的synchronize将在类实例级别被阻止。
基于此,请在下面找到我对各种场景的理解:
-
非静态同步方法访问,然后其他非静态同步方式也会阻止
-
非静态同步方法访问则非静态非同步方法不阻塞。
-
静态同步方法访问,然后阻止该类实例的其他同步(静态和非静态)方法。
-
静态同步方法访问则其他非静态非同步方法不阻塞。
-
静态同步方法访问则其他静态非同步方法不阻止。
-
静态同步方法访问然后非静态同步方法被阻止用于所有对象实例。
-
非静态同步方法访问则静态同步方法不阻止
请帮助我验证。
我认为可以用更简单的来解释
1) 当一个线程已进入同步实例方法时,则没有其他线程可以进入同一实例的任何同步实例方法
2) 当一个线程进入同步静态方法时,没有其他线程可以进入同一类的任何同步静态方法
静态同步方法只锁定表示该类的class实例。锁定类不会阻止任何其他方法,例如非静态方法。
例如
class MyClass {
public static synchronized void method() {
// something
}
相当于
class MyClass {
public static void method() {
synchronized(MyClass.class) {
// something
}
}
对象级锁适用于非静态同步方法。在使用方法时,每个对象都有一个锁,对象首先获取锁,然后执行方法中的代码。
类级锁适用于静态同步方法。每个类都有一个锁,在调用同步静态方法时使用该锁。
以下是您问题的答案:
错误
真实
静态同步方法无法访问非静态同步方法。但是非静态同步方法可以访问静态同步方法。如果我们访问静态同步方法,那么所有静态同步方法都会被阻止,但我们可以访问其他静态和非静态方法。
静态同步方法访问不会阻止其他非静态、非同步方法。
静态非同步方法将是可访问的。
非静态同步方法将被阻止,如上所述。
对象级锁可以包含类级锁,这意味着非静态同步方法可以调用静态同步方法。