synchronized其实就是加锁的意思
有两种加锁方式:1,给当前对象加锁
2,给当前对象对应的class实例加锁
看看第一种加锁方式
class M{
public synchronized void m1(){};
public synchronized void m2(){};
}
这是给对象加锁的第一种方式
比如产生了一个对象,M m = new M();此时两个线程A,B;当A操作这个m的m1方法时,会给这个m加锁,然后执行m1,而线程B调用这个m的m2时,也会想给这个m加锁,然而m已经被线程A加了锁,所以无法加锁,也就不能执行这个方法直到线程A把m1方法执行完,并把给m加的锁释放,这时线程B才能给m加锁,并执行m2方法。
再来看看第二种给对象加锁的方式,也就是加锁代码块:
class M{
public void m1(){
synchronized(this){
}
};
public void m2(){
synchronized(this){
}
};
}
this代表当前对象,加锁方式同上。
也可以这样实现:
class M{
Object o = new Object();
public void m1(){
synchronized(o){
}
};
public void m2(){
synchronized(o){
}
};
}
现在看看第2种:给class加锁;
class M{
public synchronized static void f1(){}
public synchronized static void f2(){}
}
执行方式如先前给对象加锁一样,只是这里是给class加锁了,
M m1 = new M(); M m2 = new M();
产生两个对象,两个线程A,B,当线程A操作m1的f1时,会给class M加锁,这时线程B想调用m2的方法时,会想给class M加锁,显然是不行的;然而如果把f2的static去掉后,这时线程B想调用m2的方法时确实可以的,因为它是想给m2对象加锁,显然这个对象还没被加锁。
public synchronized void f2(){}