当前位置: 首页 > 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.dtcms.com/a/321993.html

相关文章:

  • 可编辑51页PPT | 某鞋服品牌集团数字化转型项目建议书
  • 相机Camera日志实例分析之十:相机Camx【萌拍调节AE/AF拍照】单帧流程日志详解
  • 基于MATLAB实现的毫米波大规模MIMO系统中继混合预编码设计
  • [windows]torchsig 1.1.0 gr-spectrumdetect模块安装
  • LeetCode 刷题【34. 在排序数组中查找元素的第一个和最后一个位置、35. 搜索插入位置】
  • 哈希法(Java)
  • 【数据结构】排序(sort) -- 计数排序
  • wstool和git submodule优劣势对比
  • select ... for update阻塞
  • 【感知机】感知机(perceptron)学习算法例题及详解
  • 任务管理器如何查看详细的命令行和路径?
  • 安科瑞能源管理系统在某新材料公司光储充一体化项目上的应用
  • 【C++空指针革命】nullptr:告别NULL的终极解决方案与底层实现剖析
  • 在超算中心,除了立式机柜(rack-mounted)还有哪些形式?
  • 官方Windows系统部署下载工具实践指南
  • 遥测自跟踪天线系统组成、特点、功能、工作流程
  • 【普通地质学】地质年代与地层系统
  • 无人机SN模块运行与功能详解
  • Vibe coding现在能用于生产吗?
  • 什么是0.8米分辨率卫星影像数据?
  • C++ WonderTrader源码分析之自旋锁实现
  • nflsoi 8.8 题解
  • CF每日3题(1400-1700)
  • 第9章 AI 安全、可解释性与伦理合规
  • 3天落地企业级应用,JNPF+AI重塑开发效率
  • sqli-labs靶场less46-less50
  • 传送带包裹漏检率↓78%!陌讯动态感知模型在物流分拣的实战优化
  • dMSA 滥用 (BadSuccessor) 导致权限升级:使用 ADAudit Plus 监控关键属性更改
  • Python使用LLM把自然语言翻译成SQL语句
  • 线程组和线程池的基本用法