Java并发——锁框架(二)重入锁ReentrantLock

1. 重入锁

重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞。两个关键问题:

(1)线程再次获取锁。当一条线程持有这个锁并且调用lock()、lockUninterruptibly()或者任意一个tryLock()方法重新获取锁,这个锁的持有量就递增1.

(2)释放锁。当线程调用unlock()方法,持有量就递减1.当持有量降为0,锁就会被释放掉。

类ReentrantLock实现了重入锁。

2.重入锁的优势

在高线程争用的环境下具有更好的性能。当很多线程尝试访问共享资源时,JVM会花费更少的时间来调度这些线程,而把更多的时间用于执行它们。

可重入锁最大的作用是避免死锁。

3. 常用方法

(1) ReentrantLock():创建一个ReentrantLock实例。

(2)ReentrantLock(boolean fair):创建一个拥有指定公平策略的ReentrantLock的实例。当这个锁需要使用公平的排序策略时,给fair赋值为true。在争用的环境下,这个锁倾向于将访问权限分配给等待最久的线程。

(3) isFair():返回公平策略。

(4)boolean isHeldByCurrentThread():返回当前线程是否持有锁。

此外,ReentrantLock实现了Lock接口的所有方法。

4.使用

这篇博文讲的很详细:https://blog.csdn.net/ONROAD0612/article/details/78149798?locationNum=8&fps=1

一个简单例子

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDemo {

	private ReentrantLock lock = new ReentrantLock();
	
	public void method1(){
		lock.lock();
		try {
			System.out.println("方法1正常运行!");
			method2();
		}
		finally
		{
			lock.unlock();
		}
	}
	public void method2() {
		lock.lock();
		try {
			System.out.println("方法1中调用的方法2也正常运行!");
		}
		finally
		{
			lock.unlock();
		}
	}
	
	public static void main(String[] args) {
		new ReentrantLockDemo().method1();
	}

}

 运行结果:

方法1正常运行!
方法1中调用的方法2也正常运行!

猜你喜欢

转载自blog.csdn.net/zhm1563550235/article/details/84592542
今日推荐