| 1、锁降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性 |
| 2、锁降级之后,写锁并不会直接降级成读锁,不会随着读锁的释放而释放,因此需要显式地释放写锁 |
| 3、锁降级的应用场景:用于对数据比较敏感,需要在对数据修改之后,获取到修改后的值,并进行接下来的其他操作 |
| public class LockDegrade { |
| |
| public static void main(String[] args) { |
| ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); |
| Lock readLock = reentrantReadWriteLock.readLock(); |
| Lock writeLock = reentrantReadWriteLock.writeLock(); |
| |
| writeLock.lock(); |
| readLock.lock(); |
| writeLock.unlock(); |
| readLock.unlock(); |
| |
| System.out.println("程序运行结束"); |
| } |
| |
| } |
| |
| # 控制台执行结果: |
| 程序运行结束 |
| public class LockDegradeDemo { |
| |
| private int i = 0; |
| |
| private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); |
| Lock readLock = readWriteLock.readLock(); |
| Lock writeLock = readWriteLock.writeLock(); |
| |
| public void doSomething() { |
| |
| writeLock.lock(); |
| try { |
| i++; |
| |
| |
| readLock.lock(); |
| }finally { |
| |
| writeLock.unlock(); |
| } |
| |
| try { |
| |
| Thread.sleep(2000L); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| |
| try { |
| if (i == 1) { |
| System.out.println("i的值是======》1"); |
| } else { |
| System.out.println("i的值是"+i); |
| } |
| } finally { |
| readLock.unlock(); |
| } |
| } |
| |
| public static void main(String[] args) { |
| LockDegradeDemo lockDegradeDemo = new LockDegradeDemo(); |
| for (int i = 0; i < 4; i++) { |
| new Thread(()->{ |
| lockDegradeDemo.doSomething(); |
| }).start(); |
| } |
| } |
| |
| } |
| |
| # 控制台结果: |
| i的值是======》1 |
| i的值是2 |
| i的值是3 |
| i的值是4 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~