深入理解Java多线程中tryLock方法的运用与实践
本文主要介绍了Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)多线程tryLock()方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
tryLock(长时间,时间单位单位)的作用在给定等待时长内锁没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时等待。
包com。wk CTO。锁定。可重入;
导入Java。util。并发。时间单位;
导入Java。util。并发。锁。重入锁;
/**
*tryLock(长时间,时间单位单位)的基本使用
*/
公共类测试07 {
静态类时间锁链实现可运行{
私有静态可重入锁lock=new reentrant lock();//定义锁对象
@覆盖
公共无效运行(){
尝试{
if ( lock.tryLock(3,TimeUnit .秒)){ //获得锁返回真实的
系统。出去。println(线程。当前线程().getName()'获得锁,执行耗时任务');
//线程。睡眠(4000);//假设线程-0线程先持有锁,完成任务需要四秒钟,线程一线程尝试获得锁,线程一线程在3秒内还没有获得锁的话,线程一线程会放弃
线程。睡眠(2000年);//假设线程-0线程先持有锁,完成任务需要2秒钟,线程一线程尝试获得锁,线程一线程会一直尝试,在它约定尝试的3秒内可以获得锁对象
}else { //没有获得锁
系统。出去。println(线程。当前线程().getName()'没有获得锁');
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁定。isheldbycurrentthread()){
锁定。unlock();
}
}
}
}
公共静态void main(String[] args) {
time lock time lock=new time lock();
线程t1=新线程(时间锁定);
线程t2=新线程(时间锁定);
t1。start();
T2。start();
}
}
tryLock()仅在调用时锁定未被其他线程持有的锁,如果调用方法时,锁对象对其他线程持有,则放弃,调用方法尝试获得没,如果该锁没有被其他线程占用则返回真实的表示锁定成功;如果锁被其他线程占用则返回假的,不等待。
包com。wk CTO。锁定。可重入;
导入Java。util。并发。锁。重入锁;
/**
*tryLock()
* 当锁对象没有被其他线程持有的情况下才会获得该锁定
*/
公共类测试08 {
静态类服务{
私有重入锁lock=新重入锁();
public void serviceMethod(){
尝试{
if (lock.tryLock()){
系统。出去。println(线程。当前线程().getName()'获得锁定');
线程。睡眠(3000);//模拟执行任务的时长
}否则{
系统。出去。println(线程。当前线程().getName()'没有获得锁定');
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁定。isheldbycurrentthread()){
锁定。unlock();
}
}
}
}
公共静态void main(String[] args)引发中断的异常{
Service Service=new Service();
Runnable r=new Runnable() {
@覆盖
公共无效运行(){
服务。服务方法();
}
};
线程t1=新线程(r);
t1。start();
线程。睡眠(50);//睡眠50毫秒,确保一种网络的名称(传输率可达1.54mbps)级(一种通讯线路的名称)线程锁定
线程t2=新线程(r);
T2。start();
}
}
包com。wk CTO。锁定。可重入;
导入Java。util。随机;
导入Java。util。并发。锁。重入锁;
/**
* 使用tryLock()可以避免死锁
*/
公共类测试09 {
静态类IntLock实现可运行{
私有静态可重入锁lock 1=new reentrant lock();
私有静态可重入锁lock 2=new reentrant lock();
private int lockNum//用于控制锁的顺序
public IntLock(int lockNum) {
this.lockNum=lockNum
}
@覆盖
公共无效运行(){
if ( lockNum % 2==0 ){ //偶数先锁1,再锁2
while (true){
尝试{
if (lock1.tryLock()){
系统。出去。println(线程。当前线程().getName()'获得锁1, 还想获得锁2');
线程.睡眠(新随机()。nextInt(100));
尝试{
if (lock2.tryLock()){
系统。出去。println(线程。当前线程().getName()'同时获得锁一与锁2 - 完成任务了');
返回;//结束运行()方法执行,即当前线程结束
}
}最后{
如果(锁2。isheldbycurrentthread()){
2号锁。unlock();
}
}
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁1。isheldbycurrentthread()){
一号锁。unlock();
}
}
}
}else { //奇数就先锁2,再锁一
while (true){
尝试{
if (lock2.tryLock()){
系统。出去。println(线程。当前线程().getName()'获得锁2, 还想获得锁1');
线程.睡眠(新随机()。nextInt(100));
尝试{
if (lock1.tryLock()){
系统。出去。println(线程。当前线程().getName()'同时获得锁一与锁2 - 完成任务了');
返回;//结束运行()方法执行,即当前线程结束
}
}最后{
如果(锁1。isheldbycurrentthread()){
一号锁。unlock();
}
}
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁2。isheldbycurrentthread()){
2号锁。unlock();
}
}
}
}
}
}
公共静态void main(String[] args) {
int lock int lock 1=new int lock(11);
int lock int lock 2=new int lock(22);
线程t1=新线程(int lock 1);
线程t2=新线程(int lock 2);
t1。start();
T2。start();
//运行后,使用tryLock()尝试获得锁,不会傻傻的等待,通过循环不停的再次尝试,如果等待的时间足够长,线程总是会获得想要的资源
}
}
到此这篇关于详解Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)多线程tryLock()方法使用的文章就介绍到这了,更多相关Java tryLock()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
原文地址:http://www.ccttoo.com/html/2311.html
推荐阅读
-
深入理解Java中Lock和tryLock方法的工作原理与应用
-
在Java中,理解锁方法(Lock): lock与tryLock的实战运用
-
深入理解Java源码:ReentrantLock的lockInterruptibly与tryLock方法剖析
-
深入理解Java多线程中tryLock方法的运用与实践
-
理解Java多线程中的tryLock方法:轻松掌握线程同步操作
-
如何在Java中实际运用tryLock()和lock()方法: 一次解读tryLock_lock.tryLock方法的实践指南
-
深入理解Java多线程中tryLock方法的运用与实践
-
在Java中,理解并比较lock、tryLock与lockInterruptibly这三种同步方法的差异
-
深入理解Java多线程:常用JUC组件与避免死锁的方法
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾