每一个synchronized(同步)都需要与某个对象实例相关联。例如:
synchronized(obj){
//do something
}
那么当我们对方法使用synchronized关键字时,关联的对象又是什么呢?
1. 实例方法(非静态方法)
所谓的实例方法是指需要通过类对象来调用的方法,例如:
class A{
private String name;
public String getName(){
return name;
}
}
要调用A的getName()方法,我们需要有一个A的对象,然后通过该对象调用getName()方法。例如:
A a = ...;
a.getName();
在实例方法上加上synchronized关键字,那么同步对象为调用该方法的对象,例如:
public synchronized String getName(){
return name;
}
那么相当于:
A a = ...;
synchronized(a){
a.getName();
}
2. 类方法(静态方法)
静态方法是指不需要通过实例法类对象就可调用的方法,例如:
public static String getName(){
return "name";
}
如果在方法前加上synchronized声明,则同步对象是该方法所在类的class对象。例如:
public synchronized static String getName(){
return "name";
}
调用A.getName,相当于:
synchronized(A.class){
A.getName();
}