当前位置: 首页 > news >正文

解决多线程安全性问题的方法

目录

案例要求:

实现思路:

法一:同步代码块

方法二:同步方法

方法三:Lock锁

代码:

方法一:同步代码块

方法二:同步方法

方法三:Lock锁

总结:


案例要求:

实现思路:

法一:同步代码块

方法二:同步方法

方法三:Lock锁

代码:

方法一:同步代码块

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String name;private int money;public void getMoney(int money){synchronized (this) {System.out.println("开始取钱"+money+"元");if(this.money>=money){System.out.println(name+"取钱成功,取钱金额为"+money);this.money-=money;System.out.println("余额为"+this.money);}else{System.out.println("取钱失败,余额不足");}}}
}

方法二:同步方法

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String name;private int money;public synchronized void getMoney(int money){System.out.println("开始取钱"+money+"元");if(this.money>=money){System.out.println(name+"取钱成功,取钱金额为"+money);this.money-=money;System.out.println("余额为"+this.money);}else{System.out.println("取钱失败,余额不足");}}
}

方法三:Lock锁

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String name;private int money;private final Lock lk=new ReentrantLock();public synchronized void getMoney(int money){String name=Thread.currentThread().getName();System.out.println(name+"开始取钱"+money+"元");lk.lock();try {if(this.money>=money){System.out.println(name+"取钱成功,取钱金额为"+money);this.money-=money;System.out.println("余额为"+this.money);}else{System.out.println("取钱失败,余额不足");}} finally {lk.unlock();}}
}


总结:

本文展示了三种实现线程安全的Java取钱操作方案:1.同步代码块,使用synchronized(this)包裹关键代码;2.同步方法,直接在方法声明添加synchronized关键字;3.Lock锁机制,通过ReentrantLock实现更灵活的锁控制。三种方法都能有效解决多线程并发访问时的数据一致性问题,其中Lock锁提供了更细粒度的控制,需注意在finally块中释放锁。实现思路均围绕保证取钱操作的原子性展开,确保余额判断和扣款操作的完整性。

http://www.lryc.cn/news/614723.html

相关文章:

  • 无人设备遥控器之信号编码技术篇
  • 深入理解OpenGL Shader与GLSL:基础知识与优势分析
  • 【深度学习】动手深度学习PyTorch版——安装书本附带的环境和代码(Windows11)
  • list的简单介绍
  • 大厂求职 | 唯品会2026校园招聘正式启动!
  • “鱼书”深度学习进阶笔记(1)第二章
  • 微信小程序功能 表单密码强度验证
  • NOIP 2024 游记
  • [激光原理与应用-185]:光学器件 - BBO、LBO、CLBO晶体的全面比较
  • LoRA微调的代码细节
  • 2025年渗透测试面试题总结-07(题目+回答)
  • 【设计模式】访问者模式模式
  • Chrome DevTools Protocol 开启协议监视器
  • flutter开发(一)flutter命令行工具
  • SVM实战:从线性可分到高维映射再到实战演练
  • 【同余最短路】P2371 [国家集训队] 墨墨的等式|省选-
  • 在 Git 中,将本地分支的修改提交到主分支
  • 广东省省考备考(第七十天8.8)——言语、判断推理(强化训练)
  • ubuntu 22.04 使用yaml文件 修改静态ip
  • 开发板RK3568和stm32的异同:
  • Redis对象编码
  • 【Bellman-Ford】High Score
  • 荣耀秋招启动
  • Sum of Four Values(sorting and searching)
  • 两个函数 quantize() 和 dequantize() 可用于对不同的位数进行量化实验
  • 力扣-189.轮转数组
  • 优选算法 力扣 15. 三数之和 双指针降低时间复杂度 C++题解 每日一题
  • 深入解析 Seaborn:数据可视化的优雅利器
  • 自定义上传本地文件夹到七牛云
  • 虚拟机Ubuntu图形化界面root用户登录错误