Lock锁——-tryLock()方法

Lock锁——-tryLock()方法这一次主要学习Lock接口中的**tryLock()**方法。tryLock()方法是有返回值的,返回值是Boolean类型。它表示的是用来尝试获取锁:成功获取则返回true;获取失败则返回false,这个方法无论如何都会立即返回。不会像synchronized一样,一个线程获取锁之后,其他锁只能等待那个线程释放之后才能有获取锁的机会。一般情况下的tryLock获取锁匙这样使用的://实例化…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

这一次主要学习Lock接口中的**tryLock()**方法。

tryLock()方法是有返回值的,返回值是Boolean类型。它表示的是用来尝试获取锁:成功获取则返回true;获取失败则返回false,这个方法无论如何都会立即返回。不会像synchronized一样,一个线程获取锁之后,其他锁只能等待那个线程释放之后才能有获取锁的机会。
一般情况下的tryLock获取锁匙这样使用的:

//实例化Lock接口对象
Lock lock = ...;
//根据尝试获取锁的值来判断具体执行的代码
if(lock.tryLock()) {
     try{
         //处理任务
     }catch(Exception ex){
         
     }finally{
     	//当获取锁成功时最后一定要记住finally去关闭锁
         lock.unlock();   //释放锁
     } 
}else {
	//else时为未获取锁,则无需去关闭锁
    //如果不能获取锁,则直接做其他事情
}

具体简单的使用过程如下:

package Lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author jc
 *
 */
public class TryLock {
	//实例化Lock对象
	Lock lock = new ReentrantLock();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//实例化本类对象,目的是调用runThread方法
		TryLock tl = new TryLock();
		//匿名对象创建线程1,并重写run方法,启动线程
		new Thread(){
			public void run(){
				
				tl.runThread(Thread.currentThread());
			}
		}.start();
		//匿名对象创建线程2,并重写run方法,启动线程
		new Thread(){
			public void run(){
				
				tl.runThread(Thread.currentThread());
			}
		}.start();
		
		
	}
	//线程共同调用方法
	public void runThread(Thread t){
		//lock对象调用trylock()方法尝试获取锁
		if(lock.tryLock()){
			//获锁成功代码段
			System.out.println("线程"+t.getName()+"获取锁成功");
			try {
				//执行的代码
				Thread.sleep(5000);
			} catch (Exception e) {
				//异常处理内容,比如中断异常,需要恢复等
			} finally {
				//获取锁成功之后,一定记住加finally并unlock()方法,释放锁
				System.out.println("线程"+t.getName()+"释放锁");
				lock.unlock();
			}
		}else{
			//获锁失败代码段
			//具体获取锁失败的回复响应
			System.out.println("线程"+t.getName()+"获取锁失败");
		}
	}
}
/**
 * output
 * 线程Thread-0获取锁成功
 * 线程Thread-1获取锁失败
 * 线程Thread-0释放锁
 */

通过代码可以看到,Thread-0获取锁成功,Thread-1获取锁失败直接退出到else中执行else代码块。Thread-0执行sleep()方法过后正常释放锁。

tryLock()有一个重载方法,这个方法就是:**tryLock(long time , TimeUnit unit)**方法,这个方法去限定了一个尝试获取锁的时间。
—获取锁成功则返回true;
—当失败是分为两种情况:
在参数范围内,则不会立即返回值,会等待一段时间,这个时间就是传入的具体参数值,在这个时间内获取锁成功,则依旧返回true;
当过了参数范围后,还是获取锁失败,则立即返回false。
使用过程和tryLock()方法一样:

Lock lock = ...;
//根据尝试获取锁的值来判断具体执行的代码
if(lock.tryLock(long time , TimeUnit unit)) {
     try{
         //处理任务
     }catch(Exception ex){
         
     }finally{
     	//当获取锁成功时最后一定要记住finally去关闭锁
         lock.unlock();   //释放锁
     } 
}else {
	//else时为未获取锁,则无需去关闭锁
    //如果不能获取锁,则直接做其他事情
}

具体实现要分情况实现:

1.在参数时间内成功获取锁:

package Lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author jc
 *
 */
public class TryLock {
	//实例化Lock对象
	Lock lock = new ReentrantLock();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//实例化本类对象,目的是调用runThread方法
		TryLock tl = new TryLock();
		//匿名对象创建线程1,并重写run方法,启动线程
		new Thread(){
			public void run(){
				
				tl.runThread(Thread.currentThread());
			}
		}.start();
		//匿名对象创建线程2,并重写run方法,启动线程
		new Thread(){
			public void run(){
				
				tl.runThread(Thread.currentThread());
			}
		}.start();
		
		
	}
	//线程共同调用方法
	public void runThread(Thread t){
		//lock对象调用trylock(long time , TimeUnit unit)方法尝试获取锁
		try {
			//注意,这个方法需要抛出中断异常
			if(lock.tryLock(5000L,TimeUnit.MILLISECONDS)){
				//获锁成功代码段
				System.out.println("线程"+t.getName()+"获取锁成功");
				try {
					//执行的代码
					Thread.sleep(3000);
				} catch (Exception e) {
					//异常处理内容,比如中断异常
				} finally {
					//获取锁成功之后,一定记住加finally并unlock()方法,释放锁
					System.out.println("线程"+t.getName()+"释放锁");
					lock.unlock();
				}
			}else{
				//获锁失败代码段
				//具体获取锁失败的回复响应
				System.out.println("线程"+t.getName()+"获取锁失败");
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
/**
 * output
 * 线程Thread-0获取锁成功
 * 线程Thread-0释放锁
 * 线程Thread-1获取锁成功
 * 线程Thread-1释放锁
 */

从运行结果可以看到,在等待时间内成功获取了锁。

2.在参数时间内未成功获取锁

package Lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author jc
 *
 */
public class TryLock {
	//实例化Lock对象
	Lock lock = new ReentrantLock();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//实例化本类对象,目的是调用runThread方法
		TryLock tl = new TryLock();
		//匿名对象创建线程1,并重写run方法,启动线程
		new Thread(){
			public void run(){
				
				tl.runThread(Thread.currentThread());
			}
		}.start();
		//匿名对象创建线程2,并重写run方法,启动线程
		new Thread(){
			public void run(){
				
				tl.runThread(Thread.currentThread());
			}
		}.start();
		
		
	}
	//线程共同调用方法
	public void runThread(Thread t){
		//lock对象调用trylock(long time , TimeUnit unit)方法尝试获取锁
		try {
			//注意,这个方法需要抛出中断异常
			if(lock.tryLock(2000L,TimeUnit.MILLISECONDS)){
				//获锁成功代码段
				System.out.println("线程"+t.getName()+"获取锁成功");
				try {
					//执行的代码
					Thread.sleep(4000);
				} catch (Exception e) {
					//异常处理内容,比如中断异常
				} finally {
					//获取锁成功之后,一定记住加finally并unlock()方法,释放锁
					System.out.println("线程"+t.getName()+"释放锁");
					lock.unlock();
				}
			}else{
				//获锁失败代码段
				//具体获取锁失败的回复响应
				System.out.println("线程"+t.getName()+"获取锁失败");
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
/**
 * output
 * 线程Thread-0获取锁成功
 * 线程Thread-1获取锁失败
 * 线程Thread-0释放锁
 */

从运行结果可以看到,在参数时间内未过去锁,则立即退出尝试获取锁,去执行else内的代码块。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181440.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库面试常问的一些基本概念

    数据库面试常问的一些基本概念

    2020年11月12日
    172
  • JDK1.8关于运行时常量池, 字符串常量池的要点[通俗易懂]

    JDK1.8关于运行时常量池, 字符串常量池的要点[通俗易懂]网上关于jdk1.8的各种实验,结论鱼龙混杂,很多都相矛盾,网上有的实验也被后人测试出了不同的结果很多都分辨不了真假,这里记录一下网络上正确的结论,欢迎指正!首先自行区分运行时常量池与Class文件常量池(静态常量池)的概念,JVM内存模型,方法区与永久代的区别,有些在我的其他博客有介绍,连接在文尾在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在…

    2022年7月28日
    5
  • 迅雷的远程下载_迅雷下载网页

    迅雷的远程下载_迅雷下载网页-100网络连接超时点击重试或暂停/开启任务尝试解决。3设备响应超时请彻底删除该任务,重新下载。4服务器内部错误请彻底删除该任务,重新下载。5读写文件失败1:检测磁盘剩余空间;2:检测磁盘是否可读写;3:拔下硬盘连接PC修复硬盘文件,然后重新接上硬盘;4:上述方法无效的情况下,请联系客服28设备空间不足1:检测磁盘剩余空间;2:检测磁盘是否可读写;3:拔下硬盘连接PC修复硬盘文件,然后重新接上硬盘…

    2025年8月11日
    6
  • 2020最新阿里美团Java面经

    小弟是97年出生,专科18年毕业,专升本在读。工作时间总计2年半2019年12月30号投了几个简历,收到了杭州阿里和北京美团的面邀阿里,31号电面,2020年元旦中午1点在线编程。最后挂了,面试官大哥说等我工作满三年再捞我北京美团2020年1月2号现场面,技术面过了,最后因为学历是大专遗憾离场接下来的面经将合并两场面试的问题,如果有都问到的会在问题后面标记(double)多线程死锁的条…

    2022年4月12日
    46
  • Feign使用Hystrix

    Feign使用HystrixFeigh是以接口形式工作,它没有方法体,那么Feign如何整合Hystrix呢?如何实现Feign的回退呢?事实上,Spring Cloud默认已经为Feign整合了Hystrix,下面看一个实例。一 新建项目microservice-consumer-movie-feign-hystrix-fallback二 编写Feigh接口packagecom.itmuch.cloud.study.us…

    2025年6月1日
    4
  • MFC之进度条CProgressCtrl

    MFC之进度条CProgressCtrl一、成员函数简介1、create()针对不是通过资源文件上拖拉进度条控件生成的进度条,需要用此函数创建一个。2、SetRange()设置进度条的起始值和终止值。3、SetPos()设置进度条的当前位

    2022年7月2日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号