- Synchronized:悲观锁,可重入锁
- 特点:可重入的锁
可重入锁,一个获得的锁的线程没执行完可以继续获得该锁。
线程占用锁的时候,如果执行的同步代码出现异常,会自动将锁让出。
同步代码块的代码是同步执行的(一次执行完),而非同步代码块的代码可以异步执行。
要求锁的获取和释放存在同一个块结构中;当获取了多个锁时,它们必须以相反的顺序释放;
-
- 使用注意事项:区分锁对象(锁不同没有互斥作用)
分类 | 具体分类 | 当前锁对象 | 伪代码 |
同步 方法 | 实例方法 | 当前实例对象 | public synchronized void myMethod(){...} |
静态方法 | 类对象 | public static synchronized void myMethod(){...} | |
代 码 块 | 实例对象 | 当前实例对象 | synchronized(this){...} |
Class对象 | 类对象 | synchronized(MyClass.class){...} | |
Object对象 | 实例对象obj | synchronized(obj){...} |
-
- 原理:
Synchronized用于锁住当前的对象。当执行到被synchronized修饰的代码时,需先获取当前的锁对象。获取失败,则进入阻塞队列中等待;获取成功则执行代码,执行完成后释放锁对象,并通知阻塞队列。
-
- synchronized的happens-before关系:先加锁后释放锁
- JMM中的内存可见性
锁获取成功时,从主存读取共享变量到本地内存中;释放锁成功时,强制刷新本地内存数据到主存中。
-
- Synchronized优化
使用的是悲观锁的策略,即同一时间只能有一个线程去获得锁。而CAS是乐观锁的策略,