并发编程学习总结(六) :java 显式锁ReentrantLock使用详解之测试锁与超时
来源:互联网 发布:5g网络股票 编辑:程序博客网 时间:2024/05/21 08:54
并发编程学习总结(三) : 线程的中断详解
我在上面的这篇博客中,曾经写到过线程在获取锁的过程中是无法中断的。
但是ReentrantLock提供了tryLock()、tryLock(long timeout, TimeUnit unit)、lock.lockInterruptibly()
tryLock() 方法试图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他的事情。
tryLock(long timeout, TimeUnit unit) 是一个具有超时参数的尝试申请锁的方法,阻塞时间不会超过给定的值;如果成功则返回true
lockInterruptibly() 获得锁,但是会不确定地发生阻塞。如果线程被中断,抛出一个InterruptedException异常。
如果当前获得锁的线程在做大量耗时的工作,使用lock.lock()方法申请锁的线程会一直阻塞,这样就降低了多线程的效率。而使用tryLock()方法申请锁,如果锁不可用则线程不会阻塞,转而可以去做其他工作。代码实例如下:
public class ReentrantLockTest4 {private ReentrantLock lock = new ReentrantLock();public void tryLockTest() throws InterruptedException {long beginTime = System.currentTimeMillis();while(System.currentTimeMillis() - beginTime <100) {}// 当前线程尝试获得锁,如果获得锁返回true,否则返回falseif(lock.tryLock()) {try{System.out.println(Thread.currentThread().getName() + " tryLock get lock");} finally {lock.unlock();System.out.println(Thread.currentThread().getName() + " tryLock release lock");}} else {System.out.println(Thread.currentThread().getName() + " tryLock can not get lock");}}public void lockTest() {try{// 当前线程在锁可用时直接获得锁,锁不可用时阻塞当前线程lock.lock();System.out.println(Thread.currentThread().getName() + " lock get lock");long beginTime = System.currentTimeMillis();while(System.currentTimeMillis() - beginTime <1000) {}} finally {lock.unlock();System.out.println(Thread.currentThread().getName() + " lock release lock");}}public static void main(String[] args) {// TODO Auto-generated method stubfinal ReentrantLockTest4 test = new ReentrantLockTest4();Thread tryLock = new Thread(new Runnable() {public void run() {try {test.tryLockTest();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}},"tryLock_thread");Thread lock = new Thread(new Runnable() {public void run() {test.lockTest();}},"lock_thread");tryLock.start();lock.start();}}输出结果:lock_thread lock get locktryLock_thread tryLock can not get locklock_thread lock release lock
public class ReentrantLockTest5 {private ReentrantLock lock = new ReentrantLock();public void tryLockInterruptTest() {long beginTime = System.currentTimeMillis();while(System.currentTimeMillis() - beginTime <100) {}try {if (lock.tryLock(5000, TimeUnit.MILLISECONDS)) {try{System.out.println(Thread.currentThread().getName() + " tryLock get lock");}finally {lock.unlock();}}} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println(Thread.currentThread().getName() + " was interrupted");}}public void lockTest() {try{// 当前线程在锁可用时直接获得锁,锁不可用时阻塞当前线程lock.lock();System.out.println(Thread.currentThread().getName() + " lock get lock");long beginTime = System.currentTimeMillis();while(System.currentTimeMillis() - beginTime <1000) {}} finally {lock.unlock();System.out.println(Thread.currentThread().getName() + " lock release lock");}}public static void main(String[] args) {// TODO Auto-generated method stubfinal ReentrantLockTest5 test = new ReentrantLockTest5();Thread thread_tryLock = new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubtest.tryLockInterruptTest();}},"tryLockInterruptTest");Thread thread_lock = new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubtest.lockTest();}},"lockTest");thread_tryLock.start();thread_lock.start();try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("main thread was interrupted");}thread_tryLock.interrupt();}}输出结果:lockTest lock get locktryLockInterruptTest was interruptedlockTest lock release lock
0 0
- 并发编程学习总结(六) :java 显式锁ReentrantLock使用详解之测试锁与超时
- 并发编程学习总结(四) :java 显式锁ReentrantLock使用详解之lock()\unlock() 加锁与释放锁
- 并发编程学习总结(五) :java 显式锁ReentrantLock使用详解之条件对象(2)
- ReentrantLock使用详解(3)之测试锁与超时
- Java并发编程 之 Condition与ReentrantLock的使用
- JAVA并发编程学习笔记之ReentrantLock
- JAVA并发编程学习笔记之ReentrantLock
- java 并发编程学习之三 ---- ReentrantLock
- Java并发之ReentrantLock详解
- Java并发之ReentrantLock详解
- JAVA并发编程学习笔记之ReentrantLock (r)
- JAVA并发编程学习笔记之ReentrantLock—推荐-mark
- 深入学习java并发编程:ReentrantLock
- java并发编程学习7--同步--ReentrantLock
- Java 并发编程之ReentrantLock和synchronized锁
- Java并发编程之ReentrantLock源码解析
- java并发控制:ReentrantLock Condition使用详解
- java并发控制:ReentrantLock Condition使用详解
- 启动第三方app(百度地图)No Activity found to handle Intent
- uefi和legacy bios的深度剖析
- Android 抓包使用详解(包括windows用filddder和mac用Charles)
- 欢迎使用 Cmd Markdown 编辑阅读器
- 利率问题
- 并发编程学习总结(六) :java 显式锁ReentrantLock使用详解之测试锁与超时
- 怎样高效统计Android开源库的方法数
- Mysql5.6.23免安装配置
- Leetcode 28. Implement strStr()
- POJ 3620 Avoid The Lakes
- 发布Maven项目到Tomcat中
- iOS 学习之分段Table View的使用(Grouped样式表格)
- 分布式事务
- Solr调研总结