是一個典型的J2EE Web應用程序或在上面建任何的java web應用程序是多線程的應用程序,所以每次我寫一些代碼,我必須保持競爭條件或併發修改記住時間?多線程應用程序+ Web應用程序
回答
像Java中幾乎所有的架構(服務器應用程序,包括Web框架還是基於AWT或Swing GUI應用程序),Java EE的是多線程的。但是你的問題的答案是否定的:你不必關心競爭條件或併發修改。當然,你不允許犯一些錯誤(如共享Servlet變量),但在典型的應用程序中,你並不關心這樣的事情。例如,EJB規範禁止使用線程,但它具有異步作業機制。摘自EJB規範:
企業bean不能嘗試管理線程。企業 bean不得嘗試啓動,停止,掛起或恢復線程,或者更改線程的優先級或名稱。企業bean不能嘗試管理線程組。
此外,JPA規範(EntityManager)中最常用的接口不是線程安全的,儘管其他人也是如此。
在Java EE應用程序容器服務器負責將線程的爲您服務。通常它會爲每個請求創建一個線程。然而,使用Spring或EJB,你可以爲你的線程聲明不同的作用域。所以,你不應該直接管理JavaEE應用程序中的線程。
是一個典型的J2ee web應用程序或任何構建於頂級java上的web應用程序是多線程應用程序嗎?
是的,它是。但是應用程序服務器(Tomcat,JBoss,WebSphere等)爲您處理線程和資源,因此您可以不用擔心競爭條件或併發修改。
當你應該擔心併發修改?例如,如果您碰巧在Servlet中創建一個字段,並且每次請求(servlet的doPost
或doGet
方法)都更新此字段,則其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();
}
}
我會說這一切都認爲你*需要*擔心競爭條件和併發修改。根據我的經驗,開發人員都非常渴望並願意讓servlet和共享服務處於有狀態,然後再回來咬他們。事先了解問題並努力避免,而不是嘗試在事後調試和修復它。 –
@DavidConrad如果你碰巧有一個很好的servlet設計,那麼就不會有任何競爭條件或者併發修改了。這就是爲什麼我指出BalusC在這個話題上的回答。 –
- 1. 多線程Web應用程序與多線程Web服務器
- 2. Web應用程序和多線程
- 3. 多線程的web應用程序
- 4. Web應用程序,jsp和多線程
- 5. 多線程應用程序
- 6. 離線Web應用程序
- 7. Java Web應用程序中的線程
- 8. C#Web應用程序線程
- 9. Web應用程序中的線程Java
- 10. vb.net web應用程序線程
- 11. Tomcat Web應用程序線程轉儲
- 12. 編寫應用程序離線工作(Web應用程序)
- 13. java:多線程,多用戶web應用程序中的FTP
- 14. Web應用程序與Linux的多用戶應用程序
- 15. Python web應用程序部署多個應用程序實例
- 16. Web應用程序
- 17. Web應用程序實用程序類
- 18. 多線程在web應用程序中的作用
- 19. 使用多線程加速Web應用程序
- 20. 在web應用程序中使用多線程
- 21. 多線程在asp.net web應用程序中很好用嗎?
- 22. 記錄在多線程應用程序
- 23. 多線程應用程序中的System.setproperty
- 24. 策略多線程應用程序
- 25. TDD多線程應用程序
- 26. 多線程JPA應用程序合併()
- 27. 在多線程應用程序
- 28. ShutDownHook在多線程應用程序
- 29. 斷點多線程應用程序
- 30. 多線程應用程序 - C++/Debian的
是的。EJB禁止管理其內部的線程,但他們生活在多線程環境中。 –
@LuiggiMendoza eveything是Java中的多線程,任何類型的應用程序:桌面,Web。但是這個問題要求別的:是一個典型的Java EE處理線程?答案是否定的。 –
Hello World應用程序不是多線程的:)。您可以在一個Java EE應用程序的Servlet中打開多個線程。所以,答案仍然是:是的。 –