在下面的代码片段中,我有一个问题。 线程将获取类级锁还是对象级锁?
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
}
}
最佳答案
每个对象都有一个“监视器”。当您使用同步块(synchronized block)时,您可以指定要在其监视器上同步的实例。除了同步 block 之外,还有同步方法。同步实例方法将获取调用该方法的实例的监视器,而同步静态方法将获取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
}
}
关于java - 静态方法内的同步块(synchronized block)将获取类级锁或对象级锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59540141/