java多线程资源共享上锁(取钱案例)

这个博客展示了在Java中如何使用同步块避免并发问题。通过对比加锁前后的代码,解释了在多线程环境下如何确保基金余额的正确更新,防止数据不一致。示例中,两个线程尝试从同一基金账户中取款,加锁机制确保了取款操作的原子性,从而避免了余额负数的情况。
摘要由CSDN通过智能技术生成

上锁前

package gcallable;

public class UnsafeBank {
	public static void main(String[] args) {
	
		Amount amount = new Amount(500, "基金");
		Drawing you = new Drawing(amount, 50, "我");
		Drawing girl = new Drawing(amount, 60, "老婆");
		you.start();
		girl.start();
	}
}
class  Amount  {
	int money;
	String name;
	
	public Amount(int money, String name) {
		super();
		this.money = money;
		this.name = name;
	}

}
class Drawing extends Thread{
	Amount amount;
	int Drawingmoney;
	int Nowmoney;
	String name;
	
	public Drawing(Amount amount, int drawingmoney, String name) {
		super();
		this.amount = amount;
		Drawingmoney = drawingmoney;
		this.name = name;
	}

	@Override
	public void run() {
		if (amount.money-Drawingmoney<0) {
			System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
		}
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		amount.money=amount.money-Drawingmoney;
		Nowmoney=Nowmoney+Drawingmoney;
		System.out.println(amount.name+"余额:"+amount.money);
		System.out.println(this.getName()+"手里的钱:"+Nowmoney);
	}
}

基金余额:440
基金余额:440
Thread-1手里的钱:60
Thread-0手里的钱:50
上锁后

package gcallable;

public class UnsafeBank {
	public static void main(String[] args) {
	
		Amount amount = new Amount(500, "基金");
		Drawing you = new Drawing(amount, 50, "我");
		Drawing girl = new Drawing(amount, 60, "老婆");
		you.start();
		girl.start();
	}
}
class  Amount  {
	int money;
	String name;
	
	public Amount(int money, String name) {
		super();
		this.money = money;
		this.name = name;
	}

}
class Drawing extends Thread{
	Amount amount;
	int Drawingmoney;
	int Nowmoney;
	String name;
	
	public Drawing(Amount amount, int drawingmoney, String name) {
		super();
		this.amount = amount;
		Drawingmoney = drawingmoney;
		this.name = name;
	}

	@Override
	public void run() {
		synchronized (amount) {
			if (amount.money-Drawingmoney<0) {
				System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			amount.money=amount.money-Drawingmoney;
			Nowmoney=Nowmoney+Drawingmoney;
			System.out.println(amount.name+"余额:"+amount.money);
			System.out.println(this.getName()+"手里的钱:"+Nowmoney);
		}
		
	}
}

基金余额:450
Thread-0手里的钱:50
基金余额:390
Thread-1手里的钱:60
在run()里面对amount上锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值