Appearance
java
class Phone{
// 非静态同步方法
synchronized void sendEmail(){}
// 静态同步方法
static synchronized void sendSMS(){}
// 普通方法
void sayHello(){}
}当一个线程试图访问同步代码块或方法时,它必须先得到锁,退出或抛出异常时释放锁。
什么是锁?
- 对于非静态同步方法,锁是
this, 当前实例【对象锁】 - 对于同步代码块,锁是
synchronized()括号里面的对象 - 对于静态同步方法,锁是
Class对象【全局锁】
总结:
- 对于非静态同步方法,当有一个非静态同步方法在执行中,就得到了当前的对象锁,其它的非静态同步方法被调用时就必须等待其释放锁(执行完毕或抛出异常)后才可执行。【对象锁只锁当前实例,如果多个实例则互不影响】
- 对于静态同步方法,当有一个静态同步方法在执行中,就得到了当前的全局锁,其它的静态同步方法被调用就必须等待其释放锁(执行完毕或抛出异常)后才可执行。【全局锁锁的是 Class对象,多个实例也只有一个Class对象,也就是说多个实例会互相影响】
- 普通方法执行不需要获取锁,不会与其竞争锁
