2012-06-10 107 views
1

我目前正在用Apache Tomcat作爲Web服務器在Java EE中構建一個新的Web應用程序。 我在工作中使用jsps和servlets。Web應用程序,jsp和多線程

我的問題是:

我有一個非常標準的業務邏輯。沒有一個是同步的,我的Web應用邏輯中只有一個線程會在任何給定的時間運行?

由於使所有功能「同步」將導致巨大的開銷,有沒有其他的選擇呢?

如果我在我的項目中有一個靜態方法。這使得一個很簡單的事情,如:

 for (int i=0;i<10000;i++) { 
      counter++; 
     } 

如果該方法不是線程安全的,什麼是這樣的方法在多用戶應用程序的行爲?這是意外的行爲?!

,並再次以簡單的方式:

如果我的意思是要構建一個多用戶的web應用程序,我應該「同步」在我的項目一切嗎?如果不是全部,我應該同步什麼?

回答

2

我的網絡應用程序邏輯中只有一個線程會在任何時候運行?

不,servlet容器將只創建每個servlet的一個實例,並從多個線程調用該servlet的方法doService()。在默認情況下,Tomcat中最多可以有200個線程同時調用您的servlet。

如果servlet是單線程的,那麼你的應用程序會像地獄一樣慢,見SingleThreadModel - 由於某種原因而被棄用。

使所有功能「同步」會產生巨大的開銷,有沒有其他的選擇呢?

有 - 你的代碼應該是線程安全的或更好的 - 無狀態的。請注意,如果您的servlet沒有任何狀態(如可變字段 - 非常規),則可以通過多個線程安全地訪問它。這幾乎適用於所有的物體。

在您的示例代碼中使用for循環 - 如果counter是局部變量,則此代碼是線程安全的。如果它是一個領域是不安全的。每個線程都有本地變量的本地副本,而訪問相同對象的所有線程都會同時訪問相同的字段(並且需要同步)。

我應該同步什麼?

可變的全局共享狀態。例如。在您的示例代碼中,如果counter是一個字段並且已從多個線程進行修改,則必須對其進行同步(請考慮AtomicInteger)。

+0

哇,偉大的答覆男人。謝謝! – Urbanleg