ReentrantLock


前言

本文章将介绍ReentrantLock的基本性质,以及它与synchronized的区别;

一、ReentrantLock

ReentrantLock是可重入的互斥锁,它具有与synchronized相同功能,但是比synchronized更加灵活(具有更多的方法)。

1.特点

  • 可中断
  • 可以设置超时时间
  • 可以支持多个条件变量
  • 可重入

二、介绍

2.1 基本语法

// 获取ReentrantLock对象
private ReentrantLock lock = new ReentrantLock();
// 加锁 获取不到锁一直等待直到获取锁
lock.lock();
try {
	// 临界区
	// 需要执行的代码
}finally {
	// 释放锁 如果不释放其他线程就获取不到锁
	lock.unlock();
}

2.2 可重入

  • 可重入锁是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁,但如果是不可重入锁,那么第二次获得锁时会被挡住
public class Main {
	private static ReentrantLock lock = new ReentrantLock();

	public static void main(String[] args) {
		lock.lock();
		try {
			System.out.println("main");
			m1();
		} finally {
			lock.unlock();
		}
	}

	private static void m1() {
		lock.lock();
		try {
			System.out.println("i am m1");
			m2();
		} finally {
			lock.unlock();
		}
	}

	private static void m2() {
		lock.lock();
		try {
			System.out.println("i am m2");
		} finally {
			lock.unlock();
		}
	}
}

2.3 公平锁 new ReentrantLock(true)

public ReentrantLock() {
       sync = new NonfairSync();
   }
public ReentrantLock(boolean fair) {
       sync = fair ? new FairSync() : new NonfairSync();
   }
  • ReentrantLock默认是非公平锁, 可以指定为公平锁new ReentrantLock(true)。
  • 在线程获取锁失败,进入阻塞队列时,先进入的会在锁被释放后先获得锁。这样的获取方式就是公平的。一般不设置ReentrantLock为公平的, 会降低并发度

公平锁
多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。

  • 优点:所有的线程都能得到资源,不会饿死在队列中。
  • 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。

非公平锁
多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

  • 优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。
  • 缺点:这样可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁,导致饿死。

三、ReentrantLock与Synchronized的区别

ReentrantLockSynchronized
锁的实现机制AQS监视器Monitor
获取锁可以通过tryLock()尝试获取锁,更加灵活线程抢占型
释放锁必须显示通过unlock 释放锁自动释放
锁类型支持非公平锁和公平锁非公平锁
可重入性可重入可重入

总结

ReentrantLock是可重入锁,可以通过tryLock()方法尝试获取锁,很灵活,其实现机制是AQS,并且可以通过构造方法决定是公平或者非公平锁,其不会自动释放锁,需要unlock释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值