【问题标题】:Make two methods run one after another in thread while using synchronization使用同步时使两个方法在线程中依次运行
【发布时间】: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


【解决方案1】:

在这里您确实尝试单独同步函数,如果您想单独使用它们同步,这是有意义的。但是,当您希望两个函数以同步方式运行时,请尝试使用

      public void useAtm(){
              synchronized(a){
              a.checkBalance(name);
              a.withdraw(name,amt);
       }
     }

这将解决您的问题。尝试删除方法的同步标签。

    void checkBalance(String str){
    void withdraw(String str, int amt){

希望它能解决你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多