2013-11-07 5 views
2

У меня 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()? И нужно ли нам добавлять синхронизованное ключевое слово для выполнения()?

ответ

1

синхронизированный не позволит другим потокам получать доступ к одному и тому же ресурсу одновременно.

synchronized method(){ 
     allowed one Thread at a time. 
} 

соединение будет ждать завершения дочернего потока.

Parent Thread started. 

     Child Thread started 

Parent Thread is Completed but waiting for Child Thread to complete . 
     Child Thread Completed 
Parent Thread Completed 
1

Так как синхронизированно отличается от join()?

Они делают совершенно разные вещи. synchronized используется для предотвращения одновременного выполнения двумя потоками синхронизированных областей кода - в вашем конкретном случае он предотвращает одновременный запуск обоих потоков makeWithdrawl() (один будет ждать другого, если они туда попадут в одно и то же время). Thread.join() ждет выхода для выхода - в вашем конкретном случае это ждет t1, чтобы закончить полностью до начала t2. Это яблоки и апельсины.

Я рекомендую консультационная документацию по каждому:

Кроме того, здесь хороший, официальный учебник по параллелизм:

Проработайте это, и это уладит много ваших вопросов.

Итак, как синхронизированный выход отличается от join()?

Возможно, вы уже ответили на этот вопрос в своем посте; вы можете четко видеть разницу в выходе.

Смежные вопросы