java拓展----Lock锁
目录
一、介绍Lock
首先先讲一下笔者为什么会涉及到
而其他处于等待状态的对象或方法将一直处于等待状态,直到休眠完或阻塞清除,这就带来了一大并发症。而使用
二、Lock 的基本使用
它主要的方法有:
如想了解的读者请参考https://blog.csdn.net/zhuhezan/article/details/6613108
以下是
package com.demo.thread; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockThread { //创建锁对象 Lock lock = new ReentrantLock(); public void lock(String name) { // 获取锁 lock.lock(); try { System.out.println(name + "获取锁"); // 访问此锁保护的资源 } finally { // 释放锁 lock.unlock(); System.out.println(name + "释放锁"); } } public static void main(String[] args) { LockThread lt = new LockThread(); new Thread(() -> lt.lock("A")).start(); new Thread(() -> lt.lock("B")).start(); } }
三、Lock 之线程之间的通信
如果我们不使用
一下是
一下是使用
package com.demo.condition; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Condition初次使用 * 使用Condition控制线程间的通信 * @author Administrator * */ public class ConditionDemo { public static void main(String[] args) { Output output = new Output(); for(int i =0;i<2;i++){ new Thread(new Runnable() { public void run() { output.get1(1); } }).start(); new Thread(new Runnable() { public void run() { output.get2(2); } }).start(); new Thread(new Runnable() { public void run() { output.get3(3); } }).start(); } } } class Output{ private int count =1; //创建Lock对象 final Lock lock = new ReentrantLock(); //创建三个condition对象 private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void get1(int i){ //获取锁资源 lock.lock(); System.out.println("condition1已获取锁资源"); try { while(count!=1){ condition1.await(); } System.out.println("condition1获取到资源"); for(int j=0;j<10;j++){ System.out.println(i+"正在执行condition1"+j); Thread.sleep(1000); } count++; //唤醒第二个等待的线程 condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ //释放锁资源,避免锁死状态 lock.unlock(); } } public void get2(int i){ //获取锁资源 lock.lock(); System.out.println("condition2已获取锁资源"); try { while(count!=2){ condition2.await(); } System.out.println("condition2获取到资源"); for(int j=0;j<10;j++){ System.out.println(i+"正在执行condition2"+j); Thread.sleep(1000); } count++; //唤醒第三个等待的线程 condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ //释放锁资源,避免锁死状态 lock.unlock(); } } public void get3(int i){ //获取锁资源 lock.lock(); System.out.println("condition3已获取锁资源"); try { while(count!=3){ condition3.await(); } System.out.println("condition3获取到资源"); for(int j=0;j<10;j++){ System.out.println(i+"正在执行condition3"+j); Thread.sleep(1000); } count=1; //唤醒第一个等待的线程 condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ //释放锁资源,避免锁死状态 lock.unlock(); } } }
四、总结
结合以上观点来看,总而言之,使用
我们还可以直观的观测到线程之间或去锁的状态。个人还是推荐是用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!