栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Java中,如何确保我的Web应用程序是线程安全的?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java中,如何确保我的Web应用程序是线程安全的?

事实:在webapp的生存期内只有一个servlet实例。它是在webapp启动时创建的,在webapp关闭时销毁的。另请参见此答案以进行粗略的解释。

因此,它已在所有请求(线程)之间共享。如果将请求或会话范围的数据分配为实例

static
变量(或更糟的是,作为)变量,则它绝对不是线程安全的,因为它随后在应用程序范围内的所有用户(会话)的所有请求(线程)之间共享。您只需要将它们分配为方法局部变量即可保持线程安全。所以:

public class MyServlet extends HttpServlet {    private Object thisIsNOTThreadSafe;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        Object thisIsThreadSafe;        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.    } }

在开发考虑线程安全性的servlet时,基本上这就是您需要考虑的所有内容。

然后是

HttpSession
可以在同一用户的多个请求之间共享的session()属性,但是在现实世界中,您实际上不必担心同步会话访问。通常,您只在其中放置特定于用户的数据,例如已登录的用户,特定于用户的首选项,购物篮等。您只需要确保不将纯请求范围的数据放入会话范围即可。它会反映在同一会话内的多个浏览器窗口/选项卡中。

然后有application(

ServletContext
)属性,这些属性在整个应用程序范围内的所有用户之间共享,但是通常您只在其中放置常量和其他静态数据,例如webapp配置,DAO工厂,下拉列表内容等。所有这些都可以通过和完成
ServletContextListener
,也请参见基本示例的答案。您只需要确保不将纯请求范围或会话范围的数据放入应用程序范围即可。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号