多线程-ReentrantLock的tryLock和tryLock(long time, TimeUnit unit)在获取失败后还会执行吗?是否会抛出异常

答案是:会,还会继续执行下面的代码。不会进入异常。

因此实际业务中,需要按照tryLock的返回值,进行判断后执行后面的业务代码

使用tryLock()尝试获取一次锁,若获取成功,标记下是该线程获取到了锁,然后返回true;若获取失败,此时直接返回false,之后往下操作

具体示例:

1:tryLock(long time, TimeUnit unit)

package test;

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

/**
 * @author :sunshine
 * @date :Created in 2021/11/3 17:22
 * @description:T03_ReentrantLock3
 */
public class T03_ReentrantLock3 {
	Lock lock = new ReentrantLock();

	void m1(){
		try{
			lock.lock();
			for(int i = 0; i< 10 ; i++){
				TimeUnit.SECONDS.sleep(1);
				System.out.println(i);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}

	}


	void m2(){
		boolean flag = false;

		try {
			flag = lock.tryLock(5,TimeUnit.SECONDS);
			//lock.lock();
			System.out.println("m2--------locked="+flag);
		} catch (Exception e) {
			System.out.println("m2--------异常");
			e.printStackTrace();
		}finally {
			if(flag) lock.unlock();
		}
	}


	public static void main(String[] args) {
		T03_ReentrantLock3 rl = new T03_ReentrantLock3();
		new Thread(rl::m1).start();
		try {
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		new Thread(rl::m2).start();

	}

}

输出结果如下:

2:tryLock()

将m2改成tryLock后:

	void m2(){
		boolean flag = false;

		try {
			//flag = lock.tryLock(5,TimeUnit.SECONDS);
			//lock.lock();
			flag = lock.tryLock();
			System.out.println("m2--------locked="+flag);
		} catch (Exception e) {
			System.out.println("m2--------异常");
			e.printStackTrace();
		}finally {
			if(flag) lock.unlock();
		}
	}

输出结果如下:

猜你喜欢

转载自blog.csdn.net/u013282737/article/details/121126763