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