上次被问到synchronized与static synchronized的区别,虽然知道有区别,但是愣了半晌没想出来理由在哪里,温故而知新,特此记录。
synchronized需要持有对象锁,synchronized持有的是实例对象的锁,因此其只对同一实例保证同步,若需要对所有对象都保持同步,那就需要static synchronized方法了,在class文件被jvm加载之后其实也是一个class对象,static synchronized所持有的便是class对象的锁,而jvm基本能够保证class只被加载一次,也就是只有一个class对象,那么就可以保证该class所有的实例对象操作都能正确同步。
再说到abstract与synchronized,因为abstract申明的方法是没有实现的,而synchronized方法是同步一个方法内的操作,隐含的意思就是方法必须有实现,因此两者不能同时应用于一个方法的申明。
另外,abstract与static、abstract与native也不能同时用于申明一个方法,因为static方法在class文件被加载即被初始化载入内存,而abstract申明的无实现的方法无从谈起初始化;native指示方法是由本地方法,由jvm通过底层操作系统实现,abstract则指示方法由子类实现,两者指示的方法实现都不同,当然也不能同时用了。
package org.mxjun.common;
public abstract class HierarchicalTest {
public abstract void test1();
//被注释掉的方法无法通过编译
//public static abstract void test2();
//public synchronized abstract void test3();
//public native abstract void test4();
public static synchronized void test5() {
System.out.println("test5");
}
public static void main(String[] args) {
test5();
}
}