与静态块同步

时间:2014-06-02 10:56:52

标签: java static synchronization

我有一个问题:我们可以将static关键字与synchronized一起使用吗? 方法?众所周知, static 与类相关,同步用于阻止对象,使用synchronizedstatic对我没有任何意义。那么为什么以及在哪种情况下我会使用static关键字同步?

2 个答案:

答案 0 :(得分:8)

在java中,静态内容在方法定义的类对象上同步,

例如

static synchronized void aMethod() {}相当于

static void aMethod() {
      synchronized(YourClass.class){

      }
}

来自JLS 8.4.3.6

  

synchronized方法在执行之前获取锁(第17.1节)。对于   一个类(静态)方法,与Class对象关联的锁   使用方法的类。对于实例方法,锁定   与此相关联(调用该方法的对象)是   使用

OP的问题:

  

为什么我使用静态同步和“情况”?

情况是防止多个Thread同时执行静态方法。

答案 1 :(得分:2)

我认为这会对你有所帮助:

对于那些不熟悉的人,静态同步方法被锁定在类对象上,例如对于字符串类String.class,而实例同步方法锁定由this表示的当前Object实例。

由于这两个对象都不同,因此它们具有不同的锁,因此当一个线程正在执行静态同步方法时,另一个线程不需要等待该线程返回。相反,它将获取由.class文字表示的单独锁,并进入静态同步方法。

这甚至是一个流行的多线程访谈问题,面试官询问特定方法被锁定在哪个锁上,有些时候也出现在Java测试文件中。

一个例子:

public class SynchornizationMistakes {
    private static int count = 0;

    //locking on this object lock
    public synchronized int getCount(){
        return count;
    }

    //locking on .class object lock
    public static synchronized void increment(){
        count++;
    }

}