解决线程安全问题_Lock锁和线程状态概述
解决线程安全问题_Lock锁
Lock实现提供了比使用 synchronized方法和语句可获得的更广泛的锁定操作
Lock接口中的方法:
void lock() 获取锁
void unlock() 释放锁
使用步骤:
1.在成员位置创建一个ReentrantLock对象
2.在可能会出现安全问题的代码前调用lock接口中的方法lock获取锁
2.在可能会出现安全问题的代码后调用lock接口中的方法unlock释放锁
public class demg_07 implements Runnable{ //定义一个多线程共享的票源 private static int ticket = 100; //创建一个ReentrantLock对象 Lock l = new ReentrantLock(); //设置线程任务:卖票 @Override public void run() { synchronized (this){ //使用死循环让卖票操作重复执行 同步方法 while (true){ l.lock(); if (ticket > 0){ //提高安全问题出现的概率,让程序休眠 try { Thread.sleep(10); //票存在,卖票, ticket-- System.out.println(Thread.currentThread().getName()+"-->正在卖票"+ticket+"票"); ticket--; } catch (InterruptedException e) { e.printStackTrace(); }finally {//一定会执行 l.unlock();//无论程序是否异常,都会把锁释放 } } } } } }
class a{ public static void main(String[] args) { //创建Runnable接口的实现对象 demg_07 d = new demg_07(); //创建Thread类对象,构造方法中传递Runnable接口的实现对象 Thread t1 = new Thread(d); Thread t2 = new Thread(d); Thread t3 = new Thread(d); //调用start方法开启线程 t1.start(); t2.start(); t3.start(); } }
运行结果:
线程状态概述
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!