2014-03-05 166 views
2

是一個典型的J2EE Web應用程序或在上面建任何的java web應用程序是多線程的應用程序,所以每次我寫一些代碼,我必須保持競爭條件或併發修改記住時間?多線程應用程序+ Web應用程序

回答

1

像Java中幾乎所有的架構(服務器應用程序,包括Web框架還是基於AWT或Swing GUI應用程序),Java EE的是多線程的。但是你的問題的答案是否定的:你不必關心競爭條件或併發修改。當然,你不允許犯一些錯誤(如共享Servlet變量),但在典型的應用程序中,你並不關心這樣的事情。例如,EJB規範禁止使用線程,但它具有異步作業機制。摘自EJB規範:

企業bean不能嘗試管理線程。企業 bean不得嘗試啓動,停止,掛起或恢復線程,或者更改線程的優先級或名稱。企業bean不能嘗試管理線程組。

此外,JPA規範(EntityManager)中最常用的接口不是線程安全的,儘管其他人也是如此。

+0

是的。EJB禁止管理其內部的線程,但他們生活在多線程環境中。 –

+0

@LuiggiMendoza eveything是Java中的多線程,任何類型的應用程序:桌面,Web。但是這個問題要求別的:是一個典型的Java EE處理線程?答案是否定的。 –

+0

Hello World應用程序不是多線程的:)。您可以在一個Java EE應用程序的Servlet中打開多個線程。所以,答案仍然是:是的。 –

0

在Java EE應用程序容器服務器負責將線程的爲您服務。通常它會爲每個請求創建一個線程。然而,使用Spring或EJB,你可以爲你的線程聲明不同的作用域。所以,你不應該直接管理JavaEE應用程序中的線程。

2

是一個典型的J2ee web應用程序或任何構建於頂級java上的web應用程序是多線程應用程序嗎?

是的,它是。但是應用程序服務器(Tomcat,JBoss,WebSphere等)爲您處理線程和資源,因此您可以不用擔心競爭條件或併發修改。

當你應該擔心併發修改?例如,如果您碰巧在Servlet中創建一個字段,並且每次請求(servlet的doPostdoGet方法)都更新此字段,則其PC中的兩個用戶可以同時在同一個URL上執行請求,而這個領域將會有一個意想不到的價值。這裏包括:How do servlets work? Instantiation, sessions, shared variables and multithreading,接受答案的Threadsafety部分。請注意,有這樣的設計是一個不好的做法。

另一種情況可能是你射擊這個線程通過自己的共享新主題和資源。這不是一種好習慣,也不是一種壞習慣,它是一種,你必須瞭解你所承擔的風險並承擔後果。這意味着,您可以自己擁有一個Servlet並啓動線程,但是您應該以正確的方式處理這個問題。請注意,您應該評估是否真的需要在Java EE應用程序中觸發和處理線程,或者如果您可以使用其他方法(例如發射將並行和異步處理多個請求的JMS消息)。


@AndreiI注意到,在他/她的回答是EJB禁止使用線程,但是這意味着你不能在EJB裏,也不是通過創建Thread一個新的實例,也沒有使用ExecutorService或任何其他管理線程。在代碼:

@Stateless 
public class FooEJB { 
    public void bar() { 
     //this is not allowed! 
     Thread t = new Thread(new Runnable() { 
     //implementation of runnable 
     }); 
     t.start(); 
    } 
    public void baz() { 
     //this is not allowed either! 
     final int numberOfThreads = ...; 
     ExecutorService es = Executors.newFixedThreadPool(numberOfThreads); 
     es.execute(new Runnable() { ... }); 
     es.shutdown(); 
    } 
} 
+0

我會說這一切都認爲你*需要*擔心競爭條件和併發修改。根據我的經驗,開發人員都非常渴望並願意讓servlet和共享服務處於有狀態,然後再回來咬他們。事先了解問題並努力避免,而不是嘗試在事後調試和修復它。 –

+0

@DavidConrad如果你碰巧有一個很好的servlet設計,那麼就不會有任何競爭條件或者併發修改了。這就是爲什麼我指出BalusC在這個話題上的回答。 –