IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 线程安全。 -> 正文阅读

[Java知识库]线程安全。

许多在单线程情况下的代码放到多线程环境下容易出现线程安全问题
通过模拟取钱过程演示线程安全问题。 一般取钱过程:

  1. 用户输入账户、密码,系统判断用户的账户、密码是否匹配。

  2. 用户输入取款金额。

  3. 系统判断账户余额是否大于取款金额。

  4. 如果余额大于取款金额,则取款成功;如果余额小于取款金额,则取款失败。
    在模拟过程中就模拟后面三步,没有模拟账户密码验证过程。
    代码:public class TakeMoney1Demo {
    public static void main(String[] args) {
    Account account=new Account(“张三”, 5000);
    TakeMoney1 takeMoney1=new TakeMoney1(“A”,account,900);
    TakeMoney1 takeMoney2=new TakeMoney1(“B”,account,4500);

     //通过随机数,随机先启动某个线程
     Random random=new Random();
     int randomInt=random.nextInt(100);
     if(randomInt % 2 ==0) {
     	takeMoney1.start();
     	takeMoney2.start();
     }else {
     	takeMoney2.start();
     	takeMoney1.start();
     }
     
     //等待子线程结束
     try {
     	Thread.sleep(1000);
     } catch (InterruptedException e) {
     	e.printStackTrace();
     }
     System.out.println(account.getNumber() + "账户最终余额: " + account.getMoney());
    

    }
    }

class TakeMoney1 extends Thread{
//谁取钱
private String name;
//账户
private Account account;
//取多少钱
private double takeMoney;
/**
* 构造器
* @param name取钱人
* @param account账户
* @param takeMoney取多少钱
*/
public TakeMoney1(String name, Account account, double takeMoney) {
super();
this.name = name;
this.account = account;
this.takeMoney = takeMoney;
}

@Override
public void run() {
	if(takeMoney<=account.getMoney()) {
		//模拟取钱成功
		System.out.println(this.name + "取钱成功,取出  " + takeMoney + "元");
		//线程暂停 10ms 模拟网络传输
		try {
			sleep(10);
		}catch (InterruptedException e) {
			e.printStackTrace();
		}
		//修改余额
		double money=account.getMoney()-takeMoney;
		System.out.println(this.name + "取钱后,计算余额= " + money);
		account.setMoney(money);
		
		System.out.println(this.name + "取钱后,账户: " + account.getNumber()
		            		+"金额为: "+account.getMoney());
	}else {
		System.out.println(this.name + "取钱失败,原因: " + account.getNumber() + "账户余额不足");
	}
}

}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-23 00:50:03  更:2022-06-23 00:51:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:32:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码