Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的类级锁是什么_Java_Multithreading - Fatal编程技术网

java中的类级锁是什么

java中的类级锁是什么,java,multithreading,Java,Multithreading,什么是类级锁。请举例说明。如果在静态方法上使用synchronized关键字,则其监视器用于锁的对象是类对象,即由文本MyClass.class表示的对象。它还隐式地用于在类本身初始化期间进行同步。 在静态方法上同步:)它被称为内在锁,每个对象都有一个。我们需要将两件事分开,但还不完全清楚“类级锁”是什么意思 下面是一个例子: class Locker { public void x() { lock(this) { ... } } public voi

什么是类级锁。请举例说明。

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


在静态方法上同步:)

它被称为内在锁,每个对象都有一个。我们需要将两件事分开,但还不完全清楚“类级锁”是什么意思

下面是一个例子:

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

    public void y() {
        lock(this) { ... }
    }
}
正如您所看到的,这两种方法都使用“this”作为锁定目标-这样您可以保证它们永远不会交错。您可以使用同步关键字隐式地实现这一点:

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

    public synchronized void y() {
        ...
    }
}
这两个示例在字节码级别上是相同的


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

我假设您指的是同步锁。如果您不熟悉同步,它是一种防止两个不同线程同时运行相同代码的方法。在java中,使用对象锁完成同步:

Object lock = new Object();

public void doSomething(){
  ...
  synchronized(lock){
    //something dangerous
  }
  ...
}
在这段代码中,保证在给定的时间只有一个线程可以做一些危险的事情,并且在另一个线程开始运行相同的代码之前,它将完成同步块中的所有事情。我猜您所指的“类级锁”是同步方法上的隐式锁:

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

现在,这个锁实际上不在类上,而是在单个实例上(即,不是所有时钟,而是只有您的时钟)。如果您想要一个真正的“类级锁”(通常在静态方法中完成),那么您需要在一些独立于任何实例的东西上进行同步。例如:

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
    }
  }
}
类级锁和实例级锁都是不同的、互斥的。两者都不会相互干扰锁定状态。如果一个类的一个实例已经被一个线程锁定,那么除非第一个线程释放了锁,否则另一个线程无法获得该实例的锁

类级锁也有同样的行为

但是,如果一个线程获得了类级锁,那么另一个线程就可以在其一个实例上获得锁。两者都可以并行工作。

可能重复的
public class Clock{
  public static void somethingDangerous(){
    synchronized(Clock.class){
      //do something dangerous
    }
  }
}