synchronized 关键字
1. synchronized 关键字的作用
synchronized 关键字解决的是多个线程之间访问资源的同步性,用于保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
2. 作用范围
- 修饰代码块:大括号括起来的代码,作用于调用的对象。
- 修饰方法:整个方法,作用于调用的对象。
- 修饰静态方法:整个静态方法,作用于所有对象。
- 修饰类:括号括起来的部分,作用于所有对象。
其中前两种使用的锁称为对象锁,后两种称为类锁。
3. synchronized 关键字的性质
- 可重入:避免死锁、提升封装性
- 不可中断:一旦这个锁已经被别人获得了,如果我还想获得,就只能选择等待或者阻塞,知道别的线程释放这个锁。如果别人永远不释放这个锁,那么我只能永远等待下去。
4. synchronized 关键字的缺陷
-
效率低
只能等执行完锁定代码块或者遇到异常才能退出
试图获得锁时不能设定超时时间
不能中断一个正在试图获得锁的线程 -
不够灵活
加锁和释放锁的时机单一
每个锁仅有单一的条件(某个对象) -
无法知道是否成功获取到锁
5. 原子性-对比
- synchronize:不可中断,适合竞争不激烈的场景,可读性好
- lock:可中断,多样化同步,竞争激烈时能维持常态
- Atomic:竞争激烈时能维持常态,比lock性能好,只能同步一个值