什么是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() { ... } }
这两个示例在字节码级别上是相同的。
但是,通过类锁定,您可能意味着锁定实际的类对象 – 而不是它的实例。 这就是同步静态方法的工作原理。
http://www.coderanch.com/t/232571/Threads-Synchronization/java/class-level-lock-object-level#1082419
在静态方法上同步:)
类级别锁定和实例级别锁定都是不同的,互斥的。 两者都不会互相干扰锁定状态。 如果一个类的一个实例已经被一个线程锁定,那么除非第一个线程释放锁,否则另一个线程无法获得该实例的锁定。
类级别锁定的行为相同。
但是如果一个线程获得类级别锁定,那么另一个线程可以获取其实例之一的锁定。 两者都可以并行工作。