Lock

image.png

  1. Lock l = ...;
  2. l.lock();
  3. try {
  4. // access the resource protected by this lock
  5. } finally {
  6. //在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。
  7. l.unlock();
  8. }

:::tips

不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出时,也会导致锁无故释放。 :::

tryLock

  1. Lock lock = ...;
  2. if (lock.tryLock()) {
  3. try {
  4. // manipulate protected state
  5. } finally {
  6. lock.unlock();
  7. }
  8. } else {
  9. // perform alternative actions
  10. }

关于Lock与synchronized关键字在锁的处理上的重要差别


_1
. 锁的获取方式:前者是通过程序代码的方式由开发者手工获取,后者是通过JVM来获取(无需开发者干预)
2. 具体实现方式:前者是通过Java代码的方式来实现,后者是通过JVM底层来实现 (无需开发者关注)
3. 锁的释放方式:前者务必通过unlock()方法在finally块中手工释放,后者是通过JVM来释放(无需开发者关注)
4. 锁的具体类型:前者提供了多种,如公平锁、非公平锁,后者与前者均提供了可重入锁