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

时间:2013-11-04 06:44:23

标签: java multithreading jsp

会话线程的添加对象是否安全?

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

此操作线程是否安全(如果多个请求同时到达同一行代码)?

2 个答案:

答案 0 :(得分:0)

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

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

HttpSession session=request.getSession();
synchronized(session)
{
//get/set attributes to session object
} 

答案 1 :(得分:0)

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

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

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

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

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

相关问题