在使用同步的同时在线程中一个接一个地制作两个方法运行
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){
希望它能解决您的问题。
我写了一个使用同步的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){
希望它能解决您的问题。