在使用同步的同时在线程中一个接一个地制作两个方法运行

Make two methods run one after another in thread while using synchronization

我写了一个使用同步的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 后立即转到 withdraw 方法,但线程 2 在线程 1 之前可以访问检查余额可以在撤回时得到监控,我得到这样的输出。 但在其他情况下,我得到的输出为: Output 2 in order... 其中线程一个接一个地访问方法。我如何确保线程 2 或任何其他线程在线程 1 完成访问 checkBalance 和 withdraw 之前不访问 checkBalance?

基本上如何使输出为“Ram checks, Ram withdraws, S checks, S withdraws...”而不是“R checks, S checks, S withdraws, R withdraws”

主要:

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();

    }
}

这里你确实尝试了单独同步函数,如果你想单独同步使用它们是有意义的。但是当你想让两个函数以同步方式 运行 尝试使用

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

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

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

希望它能解决您的问题。