У меня 2 классов,Разница в выходе использования синхронизированного ключевого слова и присоединиться()
public class Account {
private int balance = 50;
public int getBalance() {
return balance;
}
public void withdraw(int amt){
this.balance -= amt; } }
и
public class DangerousAccount implements Runnable{
private Account acct = new Account();
public static void main(String[] args) throws InterruptedException{
DangerousAccount target = new DangerousAccount();
Thread t1 = new Thread(target);
Thread t2 = new Thread(target);
t1.setName("Ravi");
t2.setName("Prakash");
t1.start();
/* #1 t1.join(); */
t2.start();
}
public void run(){
for(int i=0; i<5; i++){
makeWithdrawl(10);
if(acct.getBalance() < 0)
System.out.println("Account Overdrawn");
}
}
public void makeWithdrawl(int amt){
if(acct.getBalance() >= amt){
System.out.println(Thread.currentThread().getName() + " is going to withdraw");
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
acct.withdraw(amt);
System.out.println(Thread.currentThread().getName() + " has finished the withdrawl");
}else{
System.out.println("Not Enough Money For " + Thread.currentThread().getName() + " to withdraw");
}
}
}
Я попытался добавить синхронизированный ключевое слово в методе makeWithdrawl
public synchronized void makeWithdrawl(int amt){
и я продолжаю получать этот выход столько раз, сколько я пытаюсь
Ravi is going to withdraw
Ravi has finished the withdrawl
Ravi is going to withdraw
Ravi has finished the withdrawl
Ravi is going to withdraw
Ravi has finished the withdrawl
Ravi is going to withdraw
Ravi has finished the withdrawl
Ravi is going to withdraw
Ravi has finished the withdrawl
Not Enough Money For Prakash to withdraw
Not Enough Money For Prakash to withdraw
Not Enough Money For Prakash to withdraw
Not Enough Money For Prakash to withdraw
Not Enough Money For Prakash to withdraw
Это показывает, что только резьба t1 работает ...
Если я не-закомментировать строку говоря
t1.join();
и удалить синхронизированные ключевое слово из метода makeWithdrawl, я получаю такой же мощность.
Если я не использую Синхронизировать ключевое слово или присоединиться() Я получаю различные выходы, как
Ravi is going to withdraw
Prakash is going to withdraw
Prakash has finished the withdrawl
Ravi has finished the withdrawl
Prakash is going to withdraw
Ravi is going to withdraw
Prakash has finished the withdrawl
Ravi has finished the withdrawl
Prakash is going to withdraw
Ravi is going to withdraw
Prakash has finished the withdrawl
Ravi has finished the withdrawl
Account Overdrawn
Account Overdrawn
Not Enough Money For Ravi to withdraw
Account Overdrawn
Not Enough Money For Prakash to withdraw
Account Overdrawn
Not Enough Money For Ravi to withdraw
Account Overdrawn
Not Enough Money For Prakash to withdraw
Account Overdrawn
Так как же выход из синхронизированного отличаются от Join()? И нужно ли нам добавлять синхронизованное ключевое слово для выполнения()?