什么是班级锁。你能用一个例子解释一下。
答案 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)
http://www.coderanch.com/t/232571/Threads-Synchronization/java/class-level-lock-object-level#1082419
在静态方法上同步:)
答案 4 :(得分:0)
类级别锁定和实例级别锁定两者是不同的,互斥的。两者都不会互相干扰锁定状态。如果一个类的一个实例已经被一个线程锁定,那么另一个线程无法获得该实例的锁定,除非第一个线程释放锁定。
类级锁定的行为相同。
但是如果一个线程获得类级别锁,那么另一个线程可以获取其实例之一的锁。两者都可以并行工作。