什么是java中的类级锁

什么是类级锁。 你能用一个例子来解释一下吗?

我假设你指的是同步锁。 如果您不熟悉同步,则可以防止同一代码同时由两个不同的线程运行。 在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 } } } 

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

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

这是一个例子:

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

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

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

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

但是,通过类锁定,您可能意味着锁定实际的类对象 – 而不是它的实例。 这就是同步静态方法的工作原理。

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

类级别锁定的行为相同。

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