Lock 锁

作者: 填坑之路_DK | 来源:发表于2021-03-29 15:33 被阅读0次

java 底层提供的一种同步机制(接口)

  1. 需手动释放(\color{#FF0000}{遇到异常也不会自动释放})
  2. 对于可重入实现类,多次加锁需多次释放

主要方法

//拿锁 拿不到则休眠 不允许Thread.interrupt中断(无效,拿到锁后再中断)
void lock();
//在0秒内尝试拿锁,拿不到也会继续执行后续代码(相当于 tryLock(0, TimeUnit.SECONDS))
boolean tryLock();
//在指定时间内持续拿锁,拿不到也会继续执行后续代码
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
//拿不到锁就休眠,当该线程获取到锁,或者线程被interrupt(不用获取锁,而会抛出一个InterruptedException)
void lockInterruptibly() throws InterruptedException;
//释放锁
void unlock();

主要实现类

ReentrantLock

可重入锁
可实现公平锁(拿锁线程会先看队列是否为空)

//指定是否为公平锁
ReentrantLock lock = new ReentrantLock(boolean fair);
ReadWriteLock

读写锁

  1. ReadLock 共享锁(其他线程可以获取ReadLock),不能升级为WriteLock,,有WriteLock 锁存在时,无法获取到ReadLock
  2. WriteLock 排它锁(其他线程无法获取任意Lock),可以降级为ReadLock,有WriteLock 或者 ReadLock 锁存在时,无法获取到WriteLock

lock 与 synchronized 的区别

类别 synchronized Lock
存在层次 Java的关键字,在jvm层面上 是一个接口
锁的释放 1、以获取锁的线程执行完同步代码,释放锁
2、线程执行发生异常,jvm会让线程释放锁
在finally中必须释放锁,不然容易造成线程死锁
拿到几次,就要释放几次(同一线程可重入)
锁的获取 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待 A: 拿不到则休眠
B: 尝试拿锁,拿不到也继续执行(可指定尝试时间)
C:拿不到则休眠,当该线程获取到锁,或者线程被interrupt继续执行
锁状态 无法判断 可以判断
锁类型 可重入 不可中断 非公平 可重入 可中断 可公平(两者皆可)
性能 少量同步 大量同步

相关文章

网友评论

      本文标题:Lock 锁

      本文链接:https://www.haomeiwen.com/subject/dzsbhltx.html