java 多线程: Thread 锁ReentrantLock 常用方法
注意
reentrantLock 和 同步代码块儿一样,同一个时刻只能一个线程获取锁,也就是共用锁的代码块部分,线程是顺序执行的
ReentrantLock 常用方法
- getHoldCount获取当前线程被锁定的次数,如果调用unlock,锁定次数会减去1:
- lock.getQueueLength() 等待获取该锁的线程的个数
- lock.getWaitQueueLength(condition) 获取某个lock下的所有condition被调用await的个数,也就是暂停状态等待被唤醒的线程个数。
- lock.hasQueuedThread(t2) 判断某个线程是否正在等待该锁
- lock.hasWaiters(condition) 判断是否有线程用了本锁下面的Condition await等待中
- isFair():判断当前锁是不是公平锁
- isHeldByCurrentThread():判断该锁是否锁定了当前线程
- isLocked():判断该锁是否锁定了任意一个线程
- tryLock(long timeOut, TimeUtil timeUtil):该锁如果在规定的时间内没有被其他线程占有,那么直接对当前线程加锁
- Condition.awaitUninterruptibly():在某个线程中使用Condition的await方法之后直接调用thread.interrupt()方法会报错。但是如果我们使用awaitUninterruptibly方法依然会起到等待的作用,但是在调用thread.interrupt()方法不会报错
- 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();
}
}
java 多线程: Thread 锁ReentrantLock 常用方法的更多相关文章
- java 多线程 Thread 锁ReentrantLock;Condition等待与通知;公平锁
1,介绍: import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; 在JA ...
- Java 多线程:锁(二)
Java 多线程:锁(二) 作者:Grey 原文地址: 博客园:Java 多线程:锁(二) CSDN:Java 多线程:锁(二) AtomicLong VS LongAddr VS Synchroni ...
- Java 多线程:锁(三)
Java 多线程:锁(三) 作者:Grey 原文地址: 博客园:Java 多线程:锁(三) CSDN:Java 多线程:锁(三) StampedLock StampedLock其实是对读写锁的一种改进 ...
- JAVA多线程与锁机制
JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 ...
- Java 多线程:锁(一)
Java 多线程:锁(一) 作者:Grey 原文地址: 博客园:Java 多线程:锁(一) CSDN:Java 多线程:锁(一) CAS 比较与交换的意思 举个例子,内存有个值是 3,如果用 Java ...
- java多线程20 : ReentrantLock中的方法 ,公平锁和非公平锁
公平锁与非公平锁 ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得 ...
- Java 重入锁 ReentrantLock 原理分析
1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...
- java多线程系列(四)---ReentrantLock的使用
Lock的使用 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理 ...
- java多线程 -- ConcurrentHashMap 锁分段 机制
hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能. Conc ...
随机推荐
- 花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘
本文所有内容均节选自<设计模式就该这样学> 序言 Design Patterns: Elements of Reusable Object-Oriented Software(以下简称&l ...
- Educational Codeforces Round 94 题解
我竟然比到了全场的 rk 14,incredible! A 大水题,直接输出 \(n\) 遍 \(s_n\) 即可. B 分类讨论题,放在 B 题可能难度有点大了. 直接暴力枚举你拿了多少个宝剑,然后 ...
- Secant 方法求方程多个根
Secant 方法介绍 Secant Method 函数 Secant_Methods 简介 1.函数定义 [c, errColumn] = Secant_Method(f, a, b, N, con ...
- [Ocean Modelling for Begineers] Ch3. Basics of Geophysical Fluid Dynamics
Ch3. Basics of Geophysical Fluid Dynamics 本章主要介绍 标量与向量 Newton定律 波动与恒定状态流体 浮力 科氏力 守恒律 紊动 N-S方程 3.1 Un ...
- Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议
Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议 索引 索引是一种存储引擎快速查询记录的一种数据结构. 注意 MYSQL一次查询只能使用一个索引 ...
- Java 读取txt文件生成Word文档
本文将以Java程序代码为例介绍如何读取txt文件中的内容,生成Word文档.在编辑代码前,可参考如下代码环境进行配置: IntelliJ IDEA Free Spire.Doc for Java T ...
- 构建LNMP+WordPress
1. 安装LNMP环境 首先修改主机名 [root@samba ~]# hostnamectl set-hostname lnmp[root@lnmp lnmp1.6-full]# hostnamec ...
- 计算机网络-4-7-内部网关协议OSPF
内部网关协议OSPF(开放最短路径优先) 出现的原因:为了克服RIP协议的缺点在1989年开发出来,**开放 表明OSPF协议不受任何厂家的限制.最短路径优先是因为使用了最短路径算法SPF**. OS ...
- CSS3实现字体描边
CSS3实现字体描边的两种方法 -webkit-text-stroke: 1px #fff;:不建议,向内描边,字体颜色变细,效果不佳: 用box-shadow模拟描边,向外描边,保留字体粗细,赞! ...
- 【PS算法理论探讨一】 Photoshop中两个32位图像混合的计算公式(含不透明度和图层混合模式)。
大家可以在网上搜索相关的主题啊,你可以搜索到一堆,不过似乎没有那一个讲的很全面,我这里抽空整理和测试一下数据,分享给大家. 我们假定有2个32位的图层,图层BG和图层FG,其中图层BG是背景层(位于下 ...