线程安全

多线程并发中的数据安全与同步:银行存款案例剖析

线程的重要问题。

出现不安全的情况:

(1)多线程并发;(2)多个线程共享数据;(3)共享数据有修改行为;

会出现不安全的变量:

静态变量、实例变量(存储在方法区和堆区,可能共享)

局部变量(不会出现不安全问题,存储在栈里)

解决方法:
使用线程同步机制,就是停止线程并发,依次进行,会牺牲效率。

线程同步涉及到同步和异步编程模型。异步即并发,同步即排队。

一个例子,存款10000,两个线程各取5000,可能出现账户余额还有5000。因为可能在t1线程获取到bankMoney是10000时,t2也恰好此时获取到是10000,然后t1执行取款操作剩5000,t2也剩5000。最后取了两次还剩5000。

//账户对象
public class Account {
	private String act;
	private int bankMoney;
	public String getAct() {
		return act;
	}
	public void setAct(String act) {
		this.act = act;
	}
	public int getBankMoney() {
		return bankMoney;
	}
	public void setBankMoney(int bankMoney) {
		this.bankMoney = bankMoney;
	}
	public void withdraw(int money) {
		int before=this.bankMoney;
		int after=before-money;
		this.bankMoney=after;
	}
}
//进程对象
public class AccountThread extends Thread{
	private Account act;
	public AccountThread(Account act) {
		this.act=act;
	}
	public void run() {
		act.withdraw(5000);
		System.out.println(Thread.currentThread().getName()+"取款成功,账户余额:"+act.getBankMoney());
	}
}

public class test {
	public static void main(String[] args) {
		Account act=new Account();
		act.setAct("act001");act.setBankMoney(10000);
		AccountThread t1=new AccountThread(act);
		AccountThread t2=new AccountThread(act);
		t1.setName("t1");t2.setName("t2");
		t1.start();t2.start();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值