0

将对象添加到会话线程安全吗?

在我的 jsp 文件中,我正在检查会话是否不包含我的对象,然后我从数据库中获取 if 并将其放入会话中。

这个操作线程是否安全(以防多个请求同时到达同一行代码)?

4

2 回答 2

0

HttpSession属性的访问不是线程安全的。多个执行请求线程的 servlet 可以同时对同一个会话对象进行主动访问。

开发人员负责对属性对象本身进行线程安全访问。您可以在对象上同步session以获取/设置属性:

HttpSession session=request.getSession();
synchronized(session)
{
//get/set attributes to session object
} 
于 2013-11-04T07:12:50.200 回答
0

即使存在基于 sessionId 的单个会话(针对用户或连接),也可以在给定会话中从该用户发起任意数量的并发请求。例如,用户可能正在加载您编写的代码以将对象从数据库添加到会话的同一个 JSP 文件。

以下是一个示例代码,用于表示您可能正在编写的内容。

object = session.getAttribute("key");
if (object == null) {
   object = getObjectFromDB();
   session.setAttribute("key", object);
}

由于线程切换可以发生在上述代码段的任何行,因此有可能多个线程注意到objectasnull并试图将对象放入会话中。由于session.setAttribute(key,value)使用相同键的每次调用都会覆盖现有值,因此不会引发错误。

但是,您必须考虑您的业务需求,并查看getObjectFromDB()不必要的多次调用是否会导致业务预期出现问题。

于 2013-11-04T07:52:05.790 回答