目录
一 、背景
之前我们学习了Synchronized关键字,它是Java语言内置的特性,因此也被称为内置锁
同时在使用时,只需要包围需要加锁的代码即可,不需要我们考虑锁的获取和释放,因此也被称为隐式锁
这样看来,使用Synchronized实现锁机制,代码会很简单,但有时并不是很灵活
在一些场景下,Synchronized就无法满足我们的需求
比如:获取锁可以被中断、超时获取锁、尝试获取锁,这些Synchronized都无法做到
为了满足这些需求,java为我们提供了显示锁Lock
1.1 Lock锁和synchronized关键字锁的对比
表格来源:https://blog.csdn.net/jiaqingShareing/article/details/88824830
类别 | synchronized锁 | Lock锁 |
存在层次 | 在Jvm的层面 | 一个类 |
锁的释放 | 1、获取了锁的线程执行完毕后,主动释放锁; 2、线程在执行时发生异常,Jvm强迫线程释放锁; |
必须在finally块中释放锁,不然会造成死锁 |
锁的获取 | 一个线程获取了锁,另外一个线程必须等待锁被释放才能继续获取 | 支持多种锁的获取的方式,比如超时获取锁,在指定时间内没获取到锁,则不再继续阻塞等待 |
锁的状态 | 不能判断锁的状态 | 可以判断锁的状态 |
锁的类型 | 可重入 不可中断 非公平 | 可重入 可中断 可公平 可不公平 |
适合场景 | 少量同步 | 大量同步 |
1.2 使用Lock标准范式
必须在finally块中释放锁,不然会造成死锁,所以要养成良好的习惯
try {
lock.lock(); //获取锁