「一分钟学Java」Synchronized与Lock区别
Synchronized与Lock区别
Synchronized
与Lock
在控制多线程操作中均有涉及,那么他们之间的区别是什么,又各自在什么场景下去使用呢?
以下表格帮你梳理。
Synchronized | Lock | |
---|---|---|
存在层次 |
Java关键词,在JVM层面 | 一个接口,JDK层面 |
锁的类型 | 可重入 不可中断 非公平 | 可重入、可判断、可公平,公平锁就是先等待的线程先获得锁。 |
锁的机制 | synchronized 原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。 |
Lock 用的是乐观锁方式。每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作。 |
锁的使用 | 很明显synchronized 的使用比较方便简洁,并且由JVM保证锁的加锁和释放 |
需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally 中声明释放锁。 |
锁的状态 | 无法判断 | 可以判断,Lock 可以通过trylock 来知道有没有获取锁 |
唤醒 | wait 、notify 、notifyAll 调度机制,要么随机唤醒一个,要么唤醒全部线程 |
Lock 可以使用Condition 进行线程之间的调度,实现分组唤醒需要的线程 |
支持分布式 | 仅限于单个实例 | 分布式锁(结合Redisson ) |
一分钟学Java 文章被收录于专栏
每天一分钟,利用碎片时间,助你上岸!!!