2015-01-16 43 views
0

當1000個請求(每個Httprequest作爲一個線程)來到調用Trust對象的存款方法的服務器時會發生什麼。更多線程同步實例的同步方法

我已經編寫了類似這樣的代碼,可以正常工作,但是如果存款金額具有使其他線程處於等待狀態的長邏輯,那麼情況如何。

class Trust { 
    private int amount; 
    public synchronized void deposit(int amount) { 
     this.amount += amount; 
     System.out.println(Thread.currentThread().getName() + "; Amount " +this.amount); 
    } 
} 

class DepositAmount implements Runnable { 
    Trust obj; 
    private int amount; 

    DepositAmount(Trust obj, int amount) { 
     this.obj = obj; 
     this.amount += amount; 
    } 
    public void run() { 
     obj.deposit(amount); 
    } 
} 

public class Bank {//CustomerToTrust { 
    public static void main(String args[]) { 
     System.out.println("Naga"); 
     //amt.nextInt(5000) 
     Trust obj = new Trust(); 
     for(int i =0; i< 100 ; i++) { 
      Random amt = new Random(); 
      new Thread(new DepositAmount(obj, 100)).start(); 
     } 
    } 
} 

的情況下存款金額的方法有很長的邏輯, 請告訴我猜想當1000個請求在一個實例來量存入信任。 剩餘的999個線程是否會被阻塞,直到第一個線程的數量減少爲止。最後一個線程怎麼樣,用戶需要等到響應時間。

+3

介紹'Thread.sleep(1000)'來模擬「長邏輯」並用你的程序進行實驗。 –

回答

1

線程將一次調用一個deposit()。因此,第1000個請求將阻塞,直到其他999個請求結束。

有兩種方法來提高性能:

  1. 會做出的​​塊儘可能快內執行的操作。
  2. 使用non-blocking algorithm

後者可以使用AtomicInteger實現:

class Trust { 
    private AtomicInteger balance = new AtomicInteger(0); 
    public void deposit(int amount) { 
     int newBalance = this.balance.addAndGet(amount); 
     System.out.println(Thread.currentThread().getName() + 
          "; Balance " + newBalance); 
    } 
} 

需要注意的是,儘管這種實現是在更新帳戶來說是正確的,輸出的字符串能夠被打印出來的順序。

另請參閱Amdahl's Law

+0

謝謝,如果在存儲非同步方法中有500行代碼中有2行代碼保存爲同步塊。連續的代碼行可以依賴於這個同步代碼(可以說保存日誌,發送新消息的消息)。你能否回答這個問題?大概所有可靠的同步代碼也應該在同步塊我猜。 –

1

「將剩餘的999個線程將被阻塞,直到第一個線程deopists量」

是。第一個線程將進入存款方式。 任何其他想要執行相同操作的線程都將進入阻塞狀態,直到資源變爲空閒狀態。

+1

謝謝,如何使這個效率。 –

1

是的,在Trust上使用同步「存款」方法的所有其他線程必須等待第一個調用方完成它的存款方法調用。 這對於您的共享狀態「信任」有點棘手......

您應該有一個單獨的線程...此線程a。)爲其他線程提供了添加「工作請求」(同步方法,它只是將請求放入一個隊列中)以及該線程內的一個方法在這個隊列中工作...因此,您將解耦需要等待整個處理完成的進程(因爲線程只需要等到該請求已被放入隊列中)。

+0

謝謝,實際上它是面試問題。下一個問題是如何處理這個問題。請告訴我答案。 –

+0

請標記答案,如果它對你有幫助;) –

+0

我剛剛得到了延遲聲譽,對不起。 –