Struts2中实现SessionAware接口的Action的Map是否线程安全?
Struts2中实现SessionAware接口的Action内Map的线程安全性
结论
实现SessionAware接口的Action中获取的Map不是线程安全对象。
原因分析
- Struts2的Action实例是每次请求创建一个新实例,但这里的
Map对应的是用户的HttpSession。同一用户发起的并发请求(比如多标签页同时请求)会共享同一个HttpSession,也就会操作同一个Map实例。 - 这个
Map本质是Struts2对HttpSession的封装(SessionMap),它直接操作底层HttpSession的属性集合,而HttpSession属性集合本身没有线程安全的实现。 - 即便Action是单请求实例化,只要多个请求属于同一个Session,就会并发访问这个
Map。如果在Action中对Map执行非原子操作(比如先判断存在再修改),就可能出现线程安全问题。
并发场景处理建议
如果需要在Session中处理并发操作,可参考以下方式:
- 对
Map的操作代码块加同步锁,比如用synchronized(map)包裹操作逻辑; - 改用线程安全的集合类存储Session数据,比如
ConcurrentHashMap,注意保证操作的原子性; - 尽量将Session中的数据设计为不可变对象,避免并发修改。
内容的提问来源于stack exchange,提问作者erod
相关产品推荐
相关产品推荐

