什么是类级别的锁。你能举个例子解释一下吗?

最佳答案

我假设您是指同步锁。如果您不熟悉同步,则可以防止两个不同线程同时运行同一代码。在Java中,同步是通过对象锁完成的:

Object lock = new Object();

public void doSomething(){
  ...
  synchronized(lock){
    //something dangerous
  }
  ...
}

在此代码中,可以确保在给定的时间只有一个线程可以执行危险的操作,并且它将在同步块(synchronized block)中完成所有操作,然后另一个线程才可以开始运行相同的代码。我猜您所说的“类级别锁”是同步方法上的隐式锁:
public synchronized void somethingDangerous(){...}

同样,在任何给定时间,只有一个线程可以执行该方法,并且总是会在另一个线程开始执行代码之前完成。这等效于“this”上的同步块(synchronized block):
public void somethingDangerous(){
  synchronized(this){
    //something dangerous
  }
}

现在,此锁实际上不在类上,而是在单个实例上(即,不是所有时钟,而是只有您的时钟)。如果要使用真正的“类级别锁”(通常在静态方法中完成),则需要在与任何实例无关的对象上进行同步。例如:
public class Clock{
  private static Object CLASS_LOCK = new Object();

  public static void doSomething(){
    ...
    synchronized(CLASS_LOCK){
      //something dangerous to all clocks, not just yours
    }
    ...
  }
}

再次有一个静态方法的隐式锁:
public class Clock{
  public static synchronized void somethingDangerous(){}
}

这等效于锁定类对象:
public class Clock{
  public static void somethingDangerous(){
    synchronized(Clock.class){
      //do something dangerous
    }
  }
}

09-15 21:58