Skip to content
java
class Phone{
    // 非静态同步方法
    synchronized void sendEmail(){}
    
    // 静态同步方法
    static synchronized void sendSMS(){}
    
    // 普通方法
    void sayHello(){}
}

当一个线程试图访问同步代码块或方法时,它必须先得到锁,退出或抛出异常时释放锁。

什么是锁?

  • 对于非静态同步方法,锁是 this, 当前实例【对象锁】
  • 对于同步代码块,锁是 synchronized()括号里面的对象
  • 对于静态同步方法,锁是 Class对象【全局锁】

总结:

  1. 对于非静态同步方法,当有一个非静态同步方法在执行中,就得到了当前的对象锁,其它的非静态同步方法被调用时就必须等待其释放锁(执行完毕或抛出异常)后才可执行。【对象锁只锁当前实例,如果多个实例则互不影响】
  2. 对于静态同步方法,当有一个静态同步方法在执行中,就得到了当前的全局锁,其它的静态同步方法被调用就必须等待其释放锁(执行完毕或抛出异常)后才可执行。【全局锁锁的是 Class对象,多个实例也只有一个Class对象,也就是说多个实例会互相影响】
  3. 普通方法执行不需要获取锁,不会与其竞争锁