一个典型的J2ee web应用程序或者任何构建在java之上的web应用程序都是多线程应用程序,所以每次我编写一些代码时,我都必须考虑竞态条件或并发修改?
发布于 2014-03-06 01:12:31
是一个典型的J2ee web应用程序,还是构建在java之上的任何web应用程序都是多线程应用程序?
是的,是这样的。而是应用服务器(Tomcat、JBoss、WebSphere等)为您处理线程和资源,因此您不必担心争用条件或并发修改。
什么时候你应该担心并发修改?例如,如果您碰巧在Servlet中创建了一个字段,并且在每次请求(servlet的doPost或doGet方法)时更新该字段,那么两个用户可以在他们的pcs上同时对同一个URL执行请求,并且该字段将具有一个意外的值。这是在这里涵盖的:How do servlets work? Instantiation, sessions, shared variables and multithreading,接受答案的线程安全部分。请注意,拥有这样的设计是一种糟糕的做法。
另一种情况可能是你启动了新的线程和你自己的线程之间共享的资源。这既不是一种好的做法,也不是一种坏的做法,它是一种你必须了解你所承担的风险并承担后果的做法。这意味着,您可以拥有一个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();
}
}发布于 2014-03-06 00:59:00
与Java中的几乎任何框架(服务器应用程序、包含式Web框架或基于AWT或Swing的GUI应用程序)一样,Java EE是多线程的。但是您的问题的答案是否定的:您不必关心竞争条件或并发修改。当然,您不允许犯一些错误(比如共享Servlet变量),但是在一个典型的应用程序中,您并不关心这些事情。例如,EJB规范禁止使用线程,但它有一个用于异步作业的机制。摘自EJB规范:
企业bean不得尝试管理线程。企业bean不得尝试启动、停止、挂起或恢复线程,也不得更改线程的优先级或名称。企业bean不能尝试管理线程组。
此外,JPA规范(EntityManager)中最常用的接口不是线程安全的,尽管其他接口也是线程安全的。
发布于 2014-03-06 00:59:54
在Java应用程序容器中,服务器为您处理线程。通常,它为每个请求创建一个线程。但是,使用Spring或EJB,您可以为线程声明不同的作用域。因此,您不必在JavaEE应用程序中直接管理线程。
https://stackoverflow.com/questions/22204174
复制相似问题