①有两个线程:会计和出纳,他俩共同拥有一个帐本 .程序要保证其中一人使用saveOrTake(int amount)时,另一个人将必须等待,即saveOrTake(int amount)方法应当是一个synchronized方法。
代码如下:
Bank类:
public class Bank implements Runnable { int money=200; public void setMoney(int n) { money=n; } public void run() { if(Thread.currentThread().getName().equals("会计")) saveOrTake(300); else if(Thread.currentThread().getName().equals("出纳")) saveOrTake(150); } public synchronized void saveOrTake(int amount) { //存取方法 if(Thread.currentThread().getName().equals("会计")) { for(int i=1;i<=3;i++) { money=money+amount/3; //每存入amount/3,稍歇一下 System.out.println(Thread.currentThread().getName()+ "存入"+amount/3+",帐上有"+money+"万,休息一会再存"); try { Thread.sleep(1000); //这时出纳仍不能使用saveOrTake方法 } catch(InterruptedException e){} } } else if(Thread.currentThread().getName().equals("出纳")) { for(int i=1;i<=3;i++) { //出纳使用存取方法取出60 money=money-amount/3; //每取出amount/3,稍歇一下 System.out.println(Thread.currentThread().getName()+ "取出"+amount/3+"帐上有"+money+"万,休息一会再取"); try { Thread.sleep(1000); //这时会计仍不能使用saveOrTake方法 } catch(InterruptedException e){} } } } }
TestBank类:
public class TestBank{ public static void main(String args[]) { Bank bank = new Bank(); bank.setMoney(200); Thread accountant, //会计 cashier; //出纳 accountant = new Thread(bank); cashier = new Thread(bank); accountant.setName("会计"); cashier.setName("出纳"); accountant.start(); cashier.start(); } }
②Synchronized关键字用法:
https://blog.csdn.net/weixin_41632656/article/details/79063503
(本人比较懒,有时间一定总结出自己的来)
原文:https://www.cnblogs.com/jianqiao123/p/10975271.html