什么是java中的类级锁

时间:2010-03-17 12:21:40

标签: java multithreading

什么是班级锁。你能用一个例子解释一下。

5 个答案:

答案 0 :(得分:23)

我假设你指的是同步锁。如果您不熟悉同步,则可以防止同一代码同时由两个不同的线程运行。在java中,使用Object锁完成同步:

Object lock = new Object();

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

在此代码中,保证只有一个线程可以在给定时间执行某些危险,并且在另一个线程可能开始运行相同代码之前,它将完成synchronized块中的所有内容。我猜你所指的是“类级别锁定”是对同步方法的隐式锁定:

public synchronized void somethingDangerous(){...}

这里同样只有一个线程可以在任何给定时间执行该方法,并且总是在另一个线程开始执行代码之前完成。这相当于“this”上的同步块:

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
    }
  }
}

答案 1 :(得分:4)

如果在synchronized方法上使用static关键字,则其监视器用于锁定的对象是类对象,即文字MyClass.class表示的对象。在类本身的初始化期间,它也被隐式地用于同步。

答案 2 :(得分:2)

它被称为内在锁,每个对象都有一个。我们需要将两件事分开,并且“类级别锁定”的含义并不完全清楚。

以下是一个例子:

class Locker {
    public void x() {
        lock(this) { ... }
    }

    public void y() {
        lock(this) { ... }
    }
}

正如您所看到的,两种方法都使用“this”作为锁定目标 - 这样您就可以保证它们不会交错。您可以使用synchronization关键字隐式实现此目的:

class Locker {
    public synchronized void x() {
        ...
    }

    public synchronized void y() {
        ...
    }
}

这两个例子在字节码级别上是相同的。

但是,通过类锁定,可以表示对实际类对象的锁定 - 而不是它的实例。这就是同步静态方法的工作原理。

答案 3 :(得分:0)

答案 4 :(得分:0)

类级别锁定实例级别锁定两者是不同的,互斥的。两者都不会互相干扰锁定状态。如果一个类的一个实例已经被一个线程锁定,那么另一个线程无法获得该实例的锁定,除非第一个线程释放锁定。

类级锁定的行为相同。

但是如果一个线程获得类级别锁,那么另一个线程可以获取其实例之一的锁。两者都可以并行工作。