gpt4 book ai didi

java - 多线程应用+网络应用

转载 作者:行者123 更新时间:2023-11-30 08:25:27 27 4
gpt4 key购买 nike

典型的 J2ee web 应用程序或任何基于 java 构建的 web 应用程序是多线程应用程序,所以每次我编写一些代码时我都必须牢记竞争条件或并发修改?

最佳答案

Is a typical J2ee web application or any web app built on top java is multi threaded application?

是的,是的。但是应用程序服务器(Tomcat、JBoss、WebSphere 等)会为您处理线程和资源,因此您可能不必担心竞争条件或并发修改。

什么时候应该担心并发修改?例如,如果您碰巧在 Servlet 中创建了一个字段,并且在每次请求(servlet 的 doPostdoGet 方法)时都更新了该字段,那么两个用户在他们的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();
}
}

关于java - 多线程应用+网络应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22204174/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com