静态方法内部的java syncronized块将获得类级锁或对象级锁
在下面的代码片段中,我有一个问题。 线程将获得类级锁还是对象级锁
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
}
}
# 1 楼答案
在
synchronized
代码块中,您已经显式地将对象类实例用作监视器对象,这意味着它将只锁定那些对象当您将函数同时定义为
static
和synchronized
时,代码块将类本身用作监视对象。因为当您定义静态函数时,该函数属于类本身,这意味着您不需要类实例来调用此类函数。因此,如果一个静态函数被定义为synchronized
,那么它在多线程环境中的执行将需要锁定所有这些线程中的某个公共监控对象,在这种情况下,它本身就是class
# 2 楼答案
每个物体都有一个“监视器”。使用同步块时,可以指定要在其监视器上同步的实例。除了同步的块之外,还有同步的方法。同步的实例方法将获取调用该方法的实例的监视器,而同步的静态方法将获取封闭类的
java.lang.Class
对象的监视器