静态方法内的同步块将获取类级锁或对象级锁



在下面的代码片段中,我有一个问题。 线程将获取类级锁或对象级锁?

private static Object lock=new Object();
private static Object lock2=new Object();
public static void m1(){
synchronized(lock){
//statements
}
}
public static void m2(){
synchronized(lock2){
//statements
}
}

每个对象都有一个"监视器"。使用同步块时,您可以指定要在其监视器上同步的实例。除了同步之外,还有同步方法。同步实例方法将获取调用该方法的实例的监视器,而同步静态方法将获取封闭类的java.lang.Class对象的监视器。

public class Foo {
private static final Object STATIC_LOCK = new Object();
private final Object instanceLock = new Object();
public static void bar() {
synchronized (STATIC_LOCK) { // acquires monitor of "STATIC_LOCK" instance
// guarded code
}
}
public static synchronized void baz() { // acquires monitor of "Foo.class" instance
// guarded code
}
public void qux() {
synchronized (instanceLock) { // acquires monitor of "instanceLock" instance
// guarded code
}
}
public synchronized void quux() { // acquires monitor of "this" instance
// guarded code
}
}

您在代码块中显式使用 Object 类实例作为监视对象synchronized这意味着它将仅锁定这些对象

当您将函数定义为static并同时synchronized两者时,代码块使用 Class 本身作为监视对象。因为当你定义一个静态函数时,该函数属于类本身,这意味着你不需要类实例来调用这样的函数。因此,如果静态函数被定义为synchronized那么它在多线程环境中的执行将需要锁定所有此类线程中的某个公共监视器对象,在这种情况下,该对象本身class

注意 - 每个类定义本身都是java.lang.Class的一个实例

最新更新