2014-03-05 129 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在这个话题上的回答。 –