互斥锁简单介绍
可重入锁意思是object.lock()获取锁后,可以再次使用object.lock()获取锁,如果发生了死锁就不是可重入锁
公平锁就是排队买票,不公平锁就是插队买票
锁实现的基本原理
1.需要一个state变量,标记锁的状态,state至少要有两个值,0,1,对state变量的操作,使用CAS保证线程安全
2.需要记录当前是哪个线程持有锁
3.需要底层支持对一个线程进行阻塞或者唤醒操作
4.需要有一个队列维护所有阻塞的线程,这个队列的要求必须是线程安全的无所队列,需要使用到CAS
有关ReentrantLock实现互斥锁
案例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package com.java.test.lock; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * @author yourheart * @Description * @create 2023-01-15 17:31 */ public class ReentrantLockService { private ReentrantLock reentrantLock = new ReentrantLock(); private Condition condition = reentrantLock.newCondition(); private List<String> arrayList = new ArrayList<>(); public void addItems(){ try { reentrantLock.lock(); if (arrayList.size() <= 0 ) { arrayList.add( "买票" ); System.out.println( "addItems -- > 开始等待删除车票" ); condition.await(); } System.out.println( "addItems -- > 执行完了" ); } catch (Exception e) { } finally { reentrantLock.unlock(); } } public void removeItems() { try { reentrantLock.lock(); if (arrayList.size() >= 0 ) { arrayList.remove( 0 ); System.out.println( "removeItems -- > 车票已删除" ); condition.signal(); } System.out.println( "removeItems -- > 执行完了" ); } catch (Exception e) { } finally { reentrantLock.unlock(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package com.java.test.lock; import org.junit.Test; /** * @author yourheart * @Description * @create 2023-01-15 17:12 */ public class ReentrantLockTest { @Test public void test() throws InterruptedException { ReentrantLockService lockService= new ReentrantLockService(); new Thread(()->{ lockService.addItems(); }).start(); new Thread(()->{ lockService.removeItems(); }).start(); while ( true ){ } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!