Synchronized 的作用

能够保证在同一时刻最多只有一个线程执行该段代码, 以达到保证并发安全的效果.

Synchronized 的地位

  • Synchronized 是 Java 的关键字, 被 Java 语言原生支持
  • 最基本的互斥同步手短

Synchronized 的两个用法

  • 对象锁:包括方法锁 (默认锁对象为 this 当前实例对象) 和同步代码块锁 (自己制定锁对象)
    • 方法锁: Synchronized 修饰普通方法, 锁对象默认为 this
    • 代码块锁: 手动指定锁对象
  • 类锁:指 Synchronized 修饰静态的方法或指定锁为 Class 对象

Synchronized 的总结

  • 一把锁只能同时被一个线程获取, 没有拿到锁的线程必须等待
  • 每个实例都对应有自己的一把锁, 不同实例之间互不影响; 有一种例外: 锁对象 *.class 以及 Synchronized 修饰的是 static 方法是, 所有的对象共用一把类锁
  • 无论是正常方法执行完毕还是抛出异常, 都会释放锁

Synchronized 的性质

  • 可重入性
    • 概念: 同一线程的外层函数获得锁之后, 内层函数可以直接再次获得该锁
    • 好处: 避免死锁, 提升封装性
    • 范围: 同一个线程 (同一个方法, 不在同一个方法, 不在同一个类)
  • 不可中断
    • 概念: 一旦别人获取了锁, 只能进行等待, 知道锁被释放

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

Live in the future, then build what's missing.