Java静态方法的同步锁

Java静态方法的同步锁必须是字节码class吗?可以是static对象吗?

如果你是synchronized加在静态方法上,那么锁就是当前类的class对象,但是如果是在静态方法内部的静态语句块,那么锁对象就可以是任意的可引用的对象。
如果是加在非静态方法上,那么锁对象就是当前this对象。实例代码:

 public class CTest {
    private static String dataStatic = new String("lock1");
    private  String dataNonStatic = new String("lock2");

    //静态方法上的同步,那么锁就是默认的当前CTest.class对象
    public static synchronized  void testStatic(){
        //方法内部的代码块的锁可以是任意的
        synchronized (dataStatic) {
            //
        }

        synchronized(CTest.class){

        }
    }

    //非静态方法上同步,锁为this
    public synchronized void testNonStatic(){
        //代码块内部,锁可以是任意的
        synchronized (this) {

        }

        synchronized (dataNonStatic) {

        }

        synchronized (CTest.class) {

        }
    }
}

synchronized用在静态方法就是意味着要锁住Class

使用synchronized代码块的话同步锁可以是其他static对象,表示把锁加在该static对象上。下面这个是加载o上

 class Test
{
    public static Object o = new Object();

    public static void test(){
        synchronized(o){
            System.out.println("test");
        }

    }
}

但是用synchronized修饰静态方法的话,那么只能是给当前类的class对象加锁。下面这个锁加在Test.class上

 class Test
{
    public synchronized static void test(){
            System.out.println("test");
    }
}