java学习:线程2-线程同步引发的问题

需求:

一个银行账户5000块,两夫妻一个拿着 存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。

class BankeTread extends Thread {

	public BankeTread() {
	}

	public BankeTread(String name) {
		super(name);
	}

	static int money = 5000;
	static Object o = new Object();

	@Override
	public void run() {

		while (true) {
			synchronized (o) {
				if(money>0){
					System.out.println(currentThread().getName() + "取走了1000元");
					money = money -1000;
					System.out.println("剩余" + (money));
					
				}else{
					
					System.out.println(currentThread().getName() + "发现没钱了");
					break;
				}
			}
		}
	}

	

}

public class Ex{
	public static void main(String[] args) throws InterruptedException {
		BankeTread ex1 = new BankeTread("丈夫");
		BankeTread ex2 = new BankeTread("妻子");
		ex2.start();
		ex1.start();

	}
}

图片:
丈夫和妻子分别取到了钱
在这里插入图片描述
妻子或丈夫一个人取光了所有钱
在这里插入图片描述
在这里插入图片描述
这就是引发的问题,当一个线程取得CPU执行权后,一直到运行完才会释放锁,另一个线程只能永远等待。。。。。
我们发现,本例只是争夺一个公共资源:money的操作权,会引发这种一个线程从始至终都霸占着资源,若是有两个甚至多个公共资源呢?下一篇文章解释这种现象,它叫死锁现象!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值