「一分钟学Java」一张表了解Synchronized与Lock区别

44 阅读1分钟

Synchronized与Lock区别

SynchronizedLock在控制多线程操作中均有涉及,那么他们之间的区别是什么,又各自在什么场景下去使用呢?

以下表格帮你梳理。

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