多线程(5)
同步方法
synchronized关键字,包括两种用法:synchronized方法和synchronized块
同步方法
public synchronized void method(int args){}
银行取钱案例
卡里有100元,我取50元,别人取100元,可以取成功,卡里余额显示-50元
加入synchronized块之后便不会发生这样的情况
package com.Thread.lesson03; import javax.swing.plaf.nimbus.AbstractRegionPainter; /** * 不安全的取钱 * */ public class UnsafeBank { public static void main(String[] args) { Account account = new Account(100,"存款"); Drawing you = new Drawing(account,50,"你"); Drawing girlFriend = new Drawing(account,100,"girlFriend"); you.start(); girlFriend.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; } //取钱 @Override public void run() { synchronized (account){//用synchronized锁住 //判断有没有钱 if (account.money-drawingMoney<0){ System.out.println(Thread.currentThread().getName()+"钱不够"); return; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //卡内余额 account.money = account.money - drawingMoney; //手头的钱 nowMoney = nowMoney + drawingMoney; System.out.println(account.name+"余额"+account.money); //Thread.currentThread().getName()=this.getName() System.out.println(this.getName()+"手里有"+nowMoney); } } }
浙公网安备 33010602011771号