package com.lyon.demo; //不安全的取钱 //两个人去银行取钱,账户 public class UnsafeBuyBank { public static void main(String[] args) { //账户 Account account = new Account(100,"生活日用"); Drawing my = new Drawing(account,50,"lyon"); Drawing son = new Drawing(account,100,"son"); my.start(); son.start(); } } //账户 class Account{ int money; //余额 String name;//卡名 public Account(int money, String name) { this.money = money; this.name = name; } } //银行:模拟取钱 class Drawing extends Thread{ //账户 Account account; //取了多少钱 int drawingMoney; //现在手里有多少钱 int nowMoney; public Drawing(Account account,int drawingMoney, String name){ super(name); this.account = account; this.drawingMoney = drawingMoney; } //取钱 //synchronized 默认锁的是this @Override public void run() { //增删改查操作的是account对象,需要锁account,而不是锁 run()方法 //synchronized (this){ 锁this还是锁银行或者说是锁 run()方法 synchronized (account){ if(account.money - drawingMoney < 0){ System.out.println(Thread.currentThread().getName()+"钱不够了"); return; } try{ Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //账户余额 account.money -= drawingMoney; //手中现金 nowMoney += drawingMoney; System.out.println(account.name+"余额是:"+account.money); //Thread.currentThread().getName() System.out.println(this.getName()+"手里有"+nowMoney); } } }
多线程之安全取钱
这篇博客通过一个Java程序展示了并发环境下两个线程同时从同一个账户取款可能导致的安全问题。程序中创建了两个线程,分别尝试取款,由于没有正确同步账户操作,导致可能的线程安全问题。博客强调了在多线程编程中对共享资源进行同步控制的重要性。
摘要由CSDN通过智能技术生成