是一个典型的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中打开多个线程。所以,答案仍然是:是的。 –