iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中lock和tryLock及lockInterruptibly的区别
  • 548
分享到

Java中lock和tryLock及lockInterruptibly的区别

2024-04-02 19:04:59 548人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.lock 方法2.lockInterruptibly 方法3.tryLock 方法4.tryLock(long,TimeUnit) 方法5.总结在 Lock 接口中,获取锁的

在 Lock 接口中,获取锁的方法有 4 个:lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly(),为什么需要这么多方法?这些方法都有什么区别?接下来我们一起来看。 

1.lock 方法

lock 方法是 Lock 接口中最基础的获取的方法,当有可用锁时会直接得到锁并立即返回,当没有可用锁时会一直等待,直到获取到锁为止,它的基础用法如下:

Lock lock = new ReentrantLock();
// 获取锁
lock.lock();
try {
    // 执行业务代码...
} finally {
    //释放锁
    lock.unlock();
}

2.lockInterruptibly 方法

lockInterruptibly 方法和 lock 方法类似,**当有可用锁时会直接得到锁并立即返回,如果没有可用锁会一直等待直到获取锁,但和 lock 方法不同,lockInterruptibly 方法在等待获取时,如果遇到线程中断会放弃获取锁。**它的基础用法如下:

Lock lock = new ReentrantLock();
try {
    // 获取锁
    lock.lockInterruptibly();
    try {
        // 执行业务方法...
    } finally {
        // 释放锁
        lock.unlock();
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}

PS:使用 thread.interrupt() 方法可以中断线程执行。

3.tryLock 方法

与前面的两个方法不同,使用无参的 tryLock 方法会尝试获取锁,并立即返回获取锁的结果(true 或 false),如果有可用锁返回 true,并得到此锁,如果没有可用锁会立即返回 false。它的基础用法如下:

Lock lock = new ReentrantLock();
// 获取锁
boolean result = lock.tryLock();
if (result) {
    try {
        // 获取锁成功,执行业务代码...
    } finally {
        // 释放锁
        lock.unlock();
    }
} else {
    // 执行获取锁失败的业务代码...
}

4.tryLock(long,TimeUnit) 方法

**有参数的 tryLock(long,TimeUnit) 方法需要设置两个参数,第一个参数是 long 类型的超时时间,第二个参数是对参数一的时间类型描述(比如第一参数是 3,那么它究竟是 3 秒还是 3 分钟,是第二个参数说了算的)。在这段时间内如果获取到可用的锁了就返回 true,如果在定义的时间内,没有得到锁就会返回 false。**它的基础用法如下:

Lock lock = new ReentrantLock();
try {
    // 获取锁(最多等待 3s,如果获取不到锁就返回 false)
    boolean result = lock.tryLock(3, TimeUnit.SECONDS);
    if (result) {
        try {
            // 获取锁成功,执行业务代码...
        } finally {
            // 释放锁
            lock.unlock();
        }
    } else {
        // 执行获取锁失败的业务代码...
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}

5.总结

lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly() 都是用来获取锁的,其中 lock 方法如果获取不到锁会一直阻塞等待;而 lockInterruptibly 方法虽然也会阻塞等待获取锁,但它却能中途响应线程的中断;无参的 tryLock 方法会立马返回一个获取锁成功与失败的结果,有参数的 tryLock(long,TimeUnit) 方法会在设定的时间内返回一个获取锁成功与失败的结果。这 4 个方法的特性各不相同,需要根据实际的业务情况选择合适获取锁的方法。

到此这篇关于Java中lock和tryLock及lockInterruptibly的区别的文章就介绍到这了,更多相关Java lock内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中lock和tryLock及lockInterruptibly的区别

本文链接: https://www.lsjlt.com/news/148232.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中lock和tryLock及lockInterruptibly的区别
    目录1.lock 方法2.lockInterruptibly 方法3.tryLock 方法4.tryLock(long,TimeUnit) 方法5.总结在 Lock 接口中,获取锁的...
    99+
    2022-11-13
  • 浅谈Java中Lock和Synchronized的区别
    目录1. 从功能角度来看2. 从特性来看3. 从性能方面来看1. 从功能角度来看 Lock和Synchronized都是java中去用来解决线程安全问题的一个工具 2. 从特性来看 ...
    99+
    2022-11-13
  • Java中Lock和Synchronized的区别是什么
    这篇文章主要讲解了“Java中Lock和Synchronized的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Lock和Synchronized的区别是什么”吧!1. ...
    99+
    2023-06-30
  • 在java中synchronized和Lock有什么区别
    在java中synchronized和Lock的区别:1.lock是接口,而synchronized是关键字2.synchronized无法判断是否获取锁的状态,而Lock可以判断。3.synchronized在发生异常时候会自动释放占有的...
    99+
    2022-10-14
  • Java String 和StringBuffer的详解及区别
    Java String 和StringBuffer的详解及区别Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串。而StringBuf...
    99+
    2023-05-31
    java string stringbuffer
  • Java中List.of()和Arrays.asList()的区别及原因分析
    目录Java中List.of()和Arrays.asList()的区别及原因1.Arrays.asList()可以插入null2.用List.of的List自然是不包含null3.L...
    99+
    2022-11-12
  • Java中notify和notifyAll的区别及何时使用
    提几个问题,从问题中去了解去学习: 他们之间有啥区别? 如果我使用notify(),将通知哪个线程? 我怎么知道有多少线程在等待,所以我可以使用notify...
    99+
    2022-11-12
  • Java中StringRedisTemplate和RedisTemplate的区别及使用方法
    在学习SpringCloud的过程中,总需要记录一下学习的过程,今天记录一下StringRedisTemplate和RedisTemplate的区别及使用方法,使用时只需使用mave...
    99+
    2023-05-15
    StringRedisTemplate RedisTemplate
  • Java中Cookie和Session详解及区别总结
    目录会话技术Cookie概念快速入门实现原理cookie的细节Cookie的特点和作用案例:记住上一次访问时间分析代码实现Session概念快速入门原理细节Session的特点Ses...
    99+
    2022-11-13
  • Java中String和StringBuffer及StringBuilder 有什么区别
    目录String类为什么是immutable(不可变的)如何保证不可变string类为不可变对象的好处前言: String 是 Java 语言非常基础和重要的类,提供了构造...
    99+
    2022-11-13
  • RSA密钥--JAVA和C#的区别及联系
    目录1、RSA语法介绍1.1 C#转JAVA1.2 JAVA转C#首先感谢:http://www.codeproject.com/Articles/25487/Cryptograph...
    99+
    2022-11-12
  • java中HashMap和LinkedHashMap的区别
    HashMaphashMap是最常用的Map,根据键的HashCode值存储数据,可以根据键直接获取它的值,具有很快的访问速度,遍历时候的顺序是完全随机的。HashMap只允许一个键为Null,允许多个值为Null。特性: 完全随机优点: ...
    99+
    2019-03-31
    java HashMap LinkedHashMap 区别
  • java中comparable和comparator的区别
    确定两个对象之间的大小关系及排列顺序称为比较,能实现这个比较功能的类或方法称之为比较器,在java中有两种比较器。内部比较器(Comparable接口)和外部比较器(Comparator接口)一、比较器排序Comparator的使用——可以...
    99+
    2015-02-01
    java comparable comparator 区别
  • java中栈和堆的区别
    在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: (推荐学习:java课程)Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区...
    99+
    2021-03-03
    java入门 java
  • java中print和println的区别
    printprintln的区别 (推荐学习:java课程)print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的...
    99+
    2017-03-18
    java入门 java
  • java中int和Integer的区别
    java中int和Integer的区别:类型不同,int是数据类型,而integer是引用类型。int存储的是数值,integer存储的是引用对象的地址。integer对象会占用更多的内存,而int占用的空间少。Integer变量与int变...
    99+
    2022-10-20
  • Java中NoClassDefFoundError 和 ClassNotFoundException的区别
    目录NoClassDefFoundErrorClassNotFoundException解决办法前言: 从类继承层次上来看,ClassNotFoundException是从Exce...
    99+
    2022-11-13
  • Java中stream.map和stream.forEach的区别
    目录什么是 stream 流stream.map 和 stream.forEach 的区别网上很多关于讲解这俩个区别的文章,但大多数要么不明不白,要么太复杂难理解。所以自己通俗的讲一...
    99+
    2022-11-13
    Java stream.map Java stream.forEach Java stream.map和stream.forEach
  • Java 中的 this 和 super 区别
    目录1、简介2、引子2.1 父类中声明无参构造函数2.2 子类显示的通过super调用父类的有参构造函数3、this4、super 5、总结5.1 对比差异 5.2 相同点 5.3 ...
    99+
    2022-11-12
  • java 中 System.out.println()和System.out.write()的区别
     java 中 System.out.println()和System.out.write()的区别.这两个函数一个是System.out.write()输出字符流,System.out.println()是输出字节流,很简单。看...
    99+
    2023-05-31
    java println() write()
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作