注意

reentrantLock 和 同步代码块儿一样,同一个时刻只能一个线程获取锁,也就是共用锁的代码块部分,线程是顺序执行的

ReentrantLock 常用方法

  1. getHoldCount获取当前线程被锁定的次数,如果调用unlock,锁定次数会减去1:
  2. lock.getQueueLength()  等待获取该锁的线程的个数
  3. lock.getWaitQueueLength(condition) 获取某个lock下的所有condition被调用await的个数,也就是暂停状态等待被唤醒的线程个数。
  4. lock.hasQueuedThread(t2) 判断某个线程是否正在等待该锁
  5. lock.hasWaiters(condition) 判断是否有线程用了本锁下面的Condition await等待中
  6. isFair():判断当前锁是不是公平锁
  7. isHeldByCurrentThread():判断该锁是否锁定了当前线程
  8. isLocked():判断该锁是否锁定了任意一个线程
  9. tryLock(long timeOut, TimeUtil timeUtil):该锁如果在规定的时间内没有被其他线程占有,那么直接对当前线程加锁
  10. Condition.awaitUninterruptibly():在某个线程中使用Condition的await方法之后直接调用thread.interrupt()方法会报错。但是如果我们使用awaitUninterruptibly方法依然会起到等待的作用,但是在调用thread.interrupt()方法不会报错
  11. condition.awaitUntil(Date deadline) 在等待时间之内可以被其它线程唤醒,等待时间一过该线程会自动唤醒,和别的线程争抢锁资源,只不过这里设置的是一个到期的具体时间。用法和condition.wait(long)没有任何区别

3、查看对应condition.await()状态的线程个数  lock.getWaitQueueLength(condition)

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* @ClassName getAwaitCount
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/25.
*/
public class ReentrantLockgetAwaitCount {
public static void main(String[] args) throws InterruptedException {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Runnable r = () -> {
lock.lock();
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
};
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10; i++) {
threads.add(new Thread(r));
}
threads.forEach(thread -> thread.start());
Thread.sleep(2000);
lock.lock();
System.out.println("目前有" + lock.getWaitQueueLength(condition) + "个线程执行了对应的condition的await方法"); //目前有10个线程执行了对应的condition的await方法
condition.signalAll();
System.out.println("目前有" + lock.getWaitQueueLength(condition) + "个线程执行了对应的condition的await方法"); //目前有0个线程执行了对应的condition的await方法
lock.unlock();
}
}

4、判断某个线程是否正在等待该锁 lock.hasQueuedThread(t2)

示例代码:

import java.util.concurrent.locks.ReentrantLock;

/**
* @ClassName ReentrantLockWaitLockOrNot
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/25.
*/
public class ReentrantLockWaitLockOrNot {
public static void main(String[] args) throws InterruptedException {
ReentrantLock lock = new ReentrantLock();
Runnable r = () -> {
lock.lock();
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
Thread.sleep(1000);
t2.start();
Thread.sleep(1000);
System.out.println(lock.hasQueuedThread(t2)); //true
}
}

5、判断是否有线程在对应锁的waiter暂停状态中 lock.hasWaiters(condition)

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* @ClassName ReentrantLockHasWaiters
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/25.
*/
public class ReentrantLockHasWaiters {
public static void main(String[] args) throws InterruptedException {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Runnable r = () -> {
lock.lock();
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
};
Thread t1 = new Thread(r);
t1.start();
Thread.sleep(1000);
lock.lock();
System.out.println(lock.hasWaiters(condition)); //true
condition.signal();
Thread.sleep(1000);
System.out.println(lock.hasWaiters(condition)); //false
lock.unlock();
}
}

最新文章

  1. SQL多表查询,消除表中的重复的内容
  2. RabbitMQ 用户角色详解
  3. Android开发-API指南-&lt;action&gt;
  4. Java API —— TreeSet类
  5. RESTful HTTP实践
  6. javascript中bind,apply,call的相同和不同之处
  7. 发送email给列表中的邮箱--python
  8. css样式继承 第7节
  9. 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)
  10. Log4net 可直接使用的配置
  11. javaScript 工作必知(七) 对象继承
  12. 关于MATLAB处理大数据坐标文件2017526
  13. Android 使用EventBus发送消息接收消息
  14. ionic安装教程
  15. 分别基于TensorFlow、PyTorch、Keras的深度学习动手练习项目
  16. 压力测试:系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  17. python之元组及其方法---整理集
  18. A KeyValuePair in Java
  19. (转) Read-through: Wasserstein GAN
  20. 兼容ie透明书写

热门文章

  1. RocketMq报错 Java HotSpot(TM) Server VM warning:
  2. Cannot connect to runtime process
  3. 详解在Linux中安装配置MySQL
  4. 洛谷 P5540 - [BalkanOI2011] timeismoney | 最小乘积生成树(最小生成树)
  5. Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)
  6. Nginx nginx: [emerg] using regex &quot;\.php$&quot; requires PCRE library 或 编译nginx错误:make[1]: *** [/pcre//Makefile] Error 127
  7. BSA分析
  8. R语言与医学统计图形-【9】过渡函数qplot
  9. jumpserver——脚本安装
  10. Spark(七)【RDD的持久化Cache和CheckPoint】