【发布时间】:2021-04-12 05:01:58
【问题描述】:
我在使用同步时为ATM机编写了一个演示代码
class Atm{
synchronized void checkBalance(String str){
System.out.print(str+" is checking his ");
try{Thread.sleep(1000);}catch(Exception e){
System.out.println(e);
}
System.out.println("Balance ");
}
synchronized void withdraw(String str, int amt){
System.out.print(str+ " is withdrawing amount: ");
try{Thread.sleep(1000);}catch(Exception e){
System.out.println(e);
}
System.out.println(amt);
}
}
class Customer extends Thread{
String name;
int amt;
Atm a;
Customer (Atm a){
this.a=a;
}
public void useAtm(){
a.checkBalance(name);
a.withdraw(name,amt);
}
public void run(){
useAtm();
}
}
在运行主方法后,我得到Output 的输出,其中一旦线程 1 在释放 checkBalance 后,就转到撤回方法,但线程 2 在线程 1 可以在撤回时获得监视器之前访问检查余额,我得到这样的输出。 但在其他情况下,我得到的输出为:Output 2 in order... 线程一个接一个地访问方法。如何确保线程 2 或任何其他线程在线程 1 完成访问 checkBalance 和撤销之前不会访问 checkBalance?
基本上如何使输出为“Ram 检查,Ram 退出,S 检查,S 退出......”而不是“R 检查,S 检查,S 退出,R 退出”
主要:
public class Main {
public static void main(String[] args) {
// write your code here
Atm a=new Atm();
Customer c1=new Customer(a);
Customer c2=new Customer(a);
Customer c3=new Customer(a);
c1.name="Ram";
c1.amt=5000;
c2.name="Hari";
c2.amt=51000;
c3.name="Shyam";
c3.amt=545000;
Customer c4=new Customer(a);
Customer c5=new Customer(a);
Customer c6=new Customer(a);
c4.name="xam";
c4.amt=500220;
c5.name="pari";
c5.amt=5100220;
c6.name="ohyam";
c6.amt=54501200;
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();
c6.start();
}
}
【问题讨论】:
-
如果你只是对现有的做一个简单的扩展,那么尝试延长显示器的持有时间 - 即
syncronized (a) { a.checkBalance(); a.withDraw() }。
标签: java multithreading synchronization