ReentrantLock的使用

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 18:34   11   0

ReentrantLock是一个可重入的互斥锁,重入锁是一种递归无阻塞的同步机制。ReentrantLock由最近成功获取锁,还没有释放的线程所拥有,当锁被另一个线程拥有时,调用lock的线程可以成功获取锁。如果锁已经被当前线程拥有,当前线程会立即返回。

重入锁的构造方法提供一个可选的公平参数:

公平情况下,操作会排一个队按顺序执行,来保证执行顺序。

不公平情况下,是无序状态允许插队,jvm会自动计算如何处理更快速来调度插队。(

1、防止重复执行(忽略重复触发)

ReentrantLock lock = new ReentrantLock();
if (lock.tryLock()) {  //如果已经被lock,则立即返回false不会等待,达到忽略操作的效果 
 try {
  //操作
 } finally {
  lock.unlock();
 }
}

2、同步执行,类似synchronized

ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁
ReentrantLock lock = new ReentrantLock(true); //公平锁

lock.lock(); //如果被其它资源锁定,会在此等待锁释放,达到暂停的效果
try {
 //操作
} finally {
    lock.unlock();
}

3、尝试等待执行

ReentrantLock lock = new ReentrantLock(true); //公平锁
try {
 if (lock.tryLock(5, TimeUnit.SECONDS)) {   
  //如果已经被lock,尝试等待5s,看是否可以获得锁,如果5s后仍然无法获得锁则返回false继续执行
  try {
   //操作
  } finally {
   lock.unlock();
  }
 }
} catch (InterruptedException e) {
 e.printStackTrace(); //当前线程被中断时(interrupt),会抛InterruptedException                 
}

4、可中断锁的同步执行

ReentrantLock lock = new ReentrantLock(true); //公平锁
lock.lockInterruptibly();
try {
    //操作
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    lock.unlock();
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP