会话线程的添加对象是否安全?
在我的jsp文件中,我正在检查会话是否包含我的对象,然后我从数据库中取出并将其放入会话中。
此操作线程是否安全(如果多个请求同时到达同一行代码)?
答案 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()
会导致业务预期出现问题。