ReentrantLock 简介及与 synchronized 比较

本文介绍了Java中的ReentrantLock,它是一个可重入、轻量级的锁,提供与synchronized相似的并发性和内存语义,但功能更丰富。ReentrantLock支持公平锁与非公平锁,具有四种获取锁的方式,包括阻塞、可轮询、可限时和可中断。此外,它还能绑定多个条件实现同步。相比于synchronized,ReentrantLock更灵活,但需要手动释放锁,且在忘记释放时可能导致死锁。在现代JVM中,两者的性能差距不大,选择使用取决于具体需求。
摘要由CSDN通过智能技术生成

Java语言提供了synchronized关键字用于加锁,但这种锁一是很重,二是获取时必须一直等待,没有额外的尝试机制。

从Java 5开始,引入了一个处理并发的java.util.concurrent包,它提供了大量更高级的并发功能。其中Lockjuc包下面的一个接口,ReentrantLock是它的常用实现类。

ReentrantLock是一个可重入的,API层面上的互斥锁,用于替代synchronized加锁。它拥有与synchronized相同的并发性和内存语义,但是添加了定时锁等候、可中断锁等候等一些特性。

基本使用

传统synchronized代码:

public class Counter {
    private int count;

    public void add(int n) {
        synchronized(this) {
            count += n;
        }
    }
}
复制代码

如果用ReentrantLock替代,代码为:

public class Counter {
    private final Lock lock = new ReentrantLock();
    private int count;

    public void add(int n) {
        lock.lock();
        try {
        	// synchronized do something
            count += n;
        } finally {
            lock.unlock();
        }
    }
}
复制代码

synchronized 是 Java 语言层面提供的一个关键字,锁和获取和释放都不需要显式调用,在异常时也会自动释放锁。

与之相比,ReentrantLock 是 Java 语法层面提供的API,是一种手动锁,需要手动获取锁lock()和释放锁unlock(),并要手动处理异常。一方面使用更加灵活,另一方面也需要特别注意,一定要记得释放锁,不然就会造成死锁。

ReentrantLock因为要手动释放锁,为避免异常时无法释放锁,需要配合try/finally语句块来完成,在finally中释放

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值