Java同步静态和非静态方法的行为



根据我的理解,在非静态方法上同步将在对象级别被阻止静态方法上的synchronize将在类实例级别被阻止。

基于此,请在下面找到我对各种场景的理解:

  1. 非静态同步方法访问,然后其他非静态同步方式也会阻止

  2. 非静态同步方法访问则非静态非同步方法不阻塞。

  3. 静态同步方法访问,然后阻止该类实例的其他同步(静态和非静态)方法。

  4. 静态同步方法访问则其他非静态非同步方法不阻塞。

  5. 静态同步方法访问则其他静态非同步方法不阻止。

  6. 静态同步方法访问然后非静态同步方法被阻止用于所有对象实例。

  7. 非静态同步方法访问则静态同步方法不阻止

请帮助我验证。

我认为可以用更简单的来解释

1) 当一个线程已进入同步实例方法时,则没有其他线程可以进入同一实例的任何同步实例方法

2) 当一个线程进入同步静态方法时,没有其他线程可以进入同一类的任何同步静态方法

静态同步方法只锁定表示该类的class实例。锁定类不会阻止任何其他方法,例如非静态方法。

例如

class MyClass {
public static synchronized void method() {
// something 
}

相当于

class MyClass {
public static void method() {
synchronized(MyClass.class) {
// something 
}
}
锁有两种类型:对象级和类级。

对象级锁适用于非静态同步方法。在使用方法时,每个对象都有一个锁,对象首先获取锁,然后执行方法中的代码。

类级锁适用于静态同步方法。每个类都有一个锁,在调用同步静态方法时使用该锁。

以下是您问题的答案:

  1. 错误

  2. 真实

  3. 静态同步方法无法访问非静态同步方法。但是非静态同步方法可以访问静态同步方法。如果我们访问静态同步方法,那么所有静态同步方法都会被阻止,但我们可以访问其他静态和非静态方法。

  4. 静态同步方法访问不会阻止其他非静态、非同步方法。

  5. 静态非同步方法将是可访问的。

  6. 非静态同步方法将被阻止,如上所述。

  7. 对象级锁可以包含类级锁,这意味着非静态同步方法可以调用静态同步方法。

最新更新