synchronized在静态办法与非静态办法上的差别:
synchronized在静态方法上表示调用前要获得类的锁,而在非静态方法上表示调用此方法前要获得对象的锁。
public class StaticSynDemo {
private static String a="test";
//等同于方法print2
public synchronized void print1(String b){ //调用前要取得StaticSynDemo实例化后对象的锁
System.out.println(b+a);
}
public void print2(String b){
synchronized (this) {//取得StaticSynDemo实例化后对象的锁
System.out.println(b+a);
}
}
//等同于方法print4
public synchronized static void print3(String b){//调用前要取得StaticSynDemo.class类的锁
System.out.println(b+a);
}
public static void print4(String b){
synchronized (StaticSynDemo.class) { //取得StaticSynDemo.class类的锁
System.out.println(b+a);
}
}
}
在static方法前加synchronized为了防止出现以下情况:
一个类有个属性,又有2个static方法中都会改变这个属性值,所以当一个线程访问该类的一个方法时,别的线程不能访问该类的这2个方法了,否则该类的属性值可能会乱。
另注,方法前加synchronized执行效率会很慢。