Java中的锁--重入锁ReentrantLock

本文介绍了Java 5.0引入的ReentrantLock,作为synchronized的高级替代品,提供了无条件、可轮询、定时及中断的锁获取操作。讨论了ReentrantLock的重进入特性,中断响应能力,以及公平锁和非公平锁的概念。强调了正确释放锁的重要性,防止意外解锁。

前言

在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronizedvolatile。Java5.0增加了一种新的机制:ReentrantLock。ReentrantLock并不是一种替代内置加锁的方法,而是当内置锁机制不适用时,作为一种可选择的高级功能。

Lock与ReentrantLock

与内置加锁机制不同的是,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显示的。如下是Lock接口:

public interface Lock {

    void lock();

    void lockInterruptibly() throws InterruptedException;

    boolean tryLock();

    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

     void unlock();

    Condition newCondition();
}

ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性。

ReentrantLock的简单使用

public static void main(String[] args){
        ReentrantLock lock = new ReentrantLock();
        lock.lock();//获取锁
        try {
            //do something
        }finally {
            lock.unlock();//释放锁
        }
 }

在finally块中释放锁,是为了保证在获取到锁后,锁最终能够被释放。
不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放。

锁的重进入

重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞。线程n次获取了锁,就需要n次释放锁,这样才能保证其它线程有机会获取锁,不然的话线程会一直在阻塞等待获取锁。

 public static void main(String[] args){
        ReentrantLock lock = new ReentrantLock();
        lock.lock();//获取锁
        lock.lock();//获取锁
        try {
            //do something
        }finally {
            lock.unlock();//释放锁
            lock.unlock();//释放锁
        }
    }

中断响应

与synchronized锁相比,Lock的lockInterruptibly方法能够在获取锁的同时保持对中断的响应。

/**
 * 线程的中断
 *
 * 1:public void interrupt() 中断线程
 * 2:public boolean isInterrupted() 判断是否被中断
 * 3:public static boolean interrupted() 判断是否被中断,并清除当前中断状态
 */
class MyThread1 implements Runnable{

    @Override
    public void run() {
//        System.out.println(Thread.currentThread().getName()+"  thream is running...");
        while (true) {
            if (Thread.currentThread().isInterrupted()) {//如果这个注释了的话,thread.interrupt();没作用
                System.out.println("线程被中断了...");
                break;
            }
            System.out.println("thream is running...");
        }
    }
}

public class ThreadDemo {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new MyThread1());
        thread.start();
        Thread.sleep(100);
        thread.interrupt();
    }
}

定时锁

定时锁可以避免发生死锁时线程一直处于阻塞状态,从而使线程提前结束。

public class TryLockMain {
    ReentrantLock lock = new ReentrantLock();

    public void methodA() throws InterruptedException {
        try{
            if (lock.tryLock(2,TimeUnit.SECONDS)){
                Thread.sleep(5000);
                System.out.println(Thread.currentThread().getName()+" methodA run...");
            }else {
                System.out.println(Thread.currentThread().getName()+"  get lock fail...");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //查询当前线程是否保持此锁定
            if (lock.isHeldByCurrentThread()){
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        TryLockMain main = new TryLockMain();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    main.methodA();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    main.methodA();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

公平锁和非公平锁

在公平的锁上,线程将按照请求的顺序来获得锁;在非公平的锁上,线程将会随机获得锁。

//false 非公平锁;true 公平锁
ReentrantLock lock = new ReentrantLock(false);
【SCI一区复现】基于配电网韧性提升的应急移动电源预配置和动态调度(下)—MPS动态调度(Matlab代码实现)内容概要:本文档围绕“基于配电网韧性提升的应急移动电源预配置和动态调度”主题,重点介绍MPS(Mobile Power Sources)动态调度的Matlab代码实现,是SCI一区论文复现的技术资料。内容涵盖在灾害或故障等极端场景下,如何通过优化算法对应急移动电源进行科学调度,以提升配电网在突发事件中的恢复能力与供电可靠性。文档强调采用先进的智能优化算法进行建模求解,并结合IEEE标准测试系统(如IEEE33节点)进行仿真验证,具有较强的学术前沿性和工程应用价值。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事电力系统优化、配电网韧性、应急电源调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于复现高水平期刊(SCI一区、IEEE顶刊)中关于配电网韧性与移动电源调度的研究成果;②支撑科研项目中的模型构建与算法开发,提升配电网在故障后的快速恢复能力;③为电力系统应急调度策略提供仿真工具与技术参考。; 阅读建议:建议结合前篇“MPS预配置”内容系统学习,重点关注动态调度模型的数学建模、目标函数设计与Matlab代码实现细节,建议配合YALMIP等优化工具包进行仿真实验,并参考文中提供的网盘资源获取完整代码与数据。
一款AI短视频生成工具,只需输入一句产品卖点或内容主题,软件便能自动生成脚本、配音、字幕和特效,并在30秒内渲染出成片。 支持批量自动剪辑,能够实现无人值守的循环生产。 一键生成产品营销与泛内容短视频,AI批量自动剪辑,高颜值跨平台桌面端工具。 AI视频生成工具是一个桌面端应用,旨在通过AI技术简化短视频的制作流程。用户可以通过简单的提示词文本+视频分镜素材,快速且自动的剪辑出高质量的产品营销和泛内容短视频。该项目集成了AI驱动的文案生成、语音合成、视频剪辑、字幕特效等功能,旨在为用户提供开箱即用的短视频制作体验。 核心功能 AI驱动:集成了最新的AI技术,提升视频制作效率和质量 文案生成:基于提示词生成高质量的短视频文案 自动剪辑:支持多种视频格式,自动化批量处理视频剪辑任务 语音合成:将生成的文案转换为自然流畅的语音 字幕特效:自动添加字幕和特效,提升视频质量 批量处理:支持批量任务,按预设自动持续合成视频 多语言支持:支持中文、英文等多种语言,满足不同用户需求 开箱即用:无需复杂配置,用户可以快速上手 持续更新:定期发布新版本,修复bug并添加新功能 安全可靠:完全本地本地化运行,确保用户数据安全 用户友好:简洁直观的用户界面,易于操作 多平台支持:支持Windows、macOS和Linux等多个操作系统
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值