Synchronized修饰普通方法
使用的锁是对象的锁,也就是锁住的是当前的对象。
public class SyncTest{
// 修饰普通方法,锁住的是当前类的一个对象
public synchronized void tong(){
}
}
//比如说
SyncTest a = new SyncTest();
SyncTest b = new SyncTest();
Thread t1 Thread t2
/* 只有t1 执行 a.tong();
t2 执行 a.tong(); 的时候能够同步;
如果说 t1 执行 a.tong();
t2 执行 b.tong(); 是不能保证同步的;
*/
Synchronized修饰静态方法
使用的锁是类对象的锁,锁住的是Class。
public class SyncTest{
//synchronized修饰静态方法
public static synchronized void tong(){
}
}
/*他锁住的是一个Class对象,向上面的例子一样,
Thread t1 t2 调用的都是SyncTest的对象,而
锁主的是SyncTest,这样的话是可以保证同步的。
*/
Synchronized修饰的同步代码块
锁的是对象的锁,不是Class,和第一个差不多。
*所以一般使用是用类锁如下
synchronized(SyncTest.class){
代码。。。。。
}
//这样锁住的就是类,而不是同一个对象,
//具体的其实还是需要看业务来决定如何使用同步