`
java2000.net
  • 浏览: 651531 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

HttpSession的线程安全问题及注意事项

阅读更多
  1. HttpSession session =  request.getSession();
  2. List<Product> list = session.getAttribute("productCart");
  3. myService.save(list); // 保存购物车数据到数据库

这个对象会被多次使用,也会被同一个用户的多个页面使用,所以他对于系统来说是线程不安全的。

比如用户在从产品列表里面选择产品,这面选择3种,他点了查看购物车
该用户还开了另一个页面,继续选择产品。

此时,在显示购物车的页面,有可能运行在一半时,其已经选择的产品列表,并另一个页面的操作修改了。所以显示的产品数量有可能并不是3种。

因为session需要维持当前用户的信息,所以其在多个线程里是共享的。所以是线程不安全的。


不过,这个是表面现象,我们只要正确使用事务,保证数据的准确性,表面的问题可以不用管它。

我们可以把session里面的数据另外保存到一个新的数据对象里,这个对象不再因为session的改变而出现变动。这个对象传递给业务层进行事务处理,保证数据级别的准确。

千万不要把session,或者 session里面的对象直接传递给业务层,因为你的业务处理一半时,同样可能出现session对象被改变的情况。有可能造成重要数据出现偏差。
举例:

session 对应三个产品,
事务里面循环了产品,并计算了总价格,
计算完毕,准备保存时,session变了,产品变成了4个。
此时开始保存。产品保存了4个,可总价格却还是3个的。

出现了数据不一致。

修改后的例子
session 对应三个产品
重新生成一个产品对象数组,把session数据复制过来,然后传递给业务层
事务里面循环计算总价格
计算完毕,此时session变了,但并不影响我们这个新的产品数组对象
保存,三个产品,价格也正确。
  1. HttpSession session =  request.getSession();
  2. List<Product>  list = session.getAttribute("productCart");
  3. List<Product> listNew = new ArrayList<Product>();
  4. Product pNew;
  5. for(Product p : list){
  6.   pNew = new Product();
  7.   pNew.setProductId(p.getProductId());
  8.   // 其它的复制参数的语句
  9.   listNew.add(pNew); // 保存到新的列表里面
  10. }
  11. myService.save(listNew); // 保存购物车数据到数据库,这个是安全的

总结:
有些线程安全问题是很隐蔽的,等你出了问题,很可能根本不认为会是那里出的问题。记住一点,Java里面的对象传递的是对象的引用,只要2个地方用了相同的引用,则其它地方的变动,这一面也会变动。

原文:http://www.java2000.net/p9667









<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
分享到:
评论
1 楼 case0079 2009-03-22  
List<Product>  list = session.getAttribute("productCart");
List<Product> listNew = new ArrayList<Product>();
就是线程不安全的了.

相关推荐

    WEB开发注意事项

    在WEB开发过程中,需要注意多个方面的细节来确保代码的性能和稳定性。以下是一些重要的实践和技巧: 1. **集合和映射对象初始化**:在创建`Collection`和`Map`对象时,应预估所需容量并正确初始化。例如,创建`...

    struts2中action如何获取jsp页面参数1.pdf

    ThreadLocal确保了ActionContext中的属性只在当前请求线程内可见,这样就避免了线程安全问题。 3. **ServletActionContext** `ServletActionContext`扩展了`ActionContext`,提供直接访问Servlet API的方法。例如...

    Java自定义过滤器

    #### 五、注意事项 1. **线程安全性**:确保过滤器内部的状态不会导致多线程环境下的问题。 2. **资源释放**:在`doFilter`方法中使用了额外资源,应在方法结束前释放这些资源。 3. **异常处理**:适当处理可能出现...

    ActionContext介绍(在Struts2中)

    **注意事项** 使用ActionContext时,需要特别注意不要在Action的构造函数中获取ActionContext,因为那时ActionContext可能还未完全初始化,获取到的值可能是null。正确的做法是在Action的execute方法或其他业务方法...

    2016年最新java面试题及答案,使用于初级java程序员的面试

    #### 九、文件上传和下载时的注意事项 **知识点解析:** 1. **表单编码类型:**为了正确处理文件上传,表单的 `enctype` 属性必须设置为 `"multipart/form-data"`。 2. **处理大文件:**注意文件大小限制和服务器...

    Java 面试题 总结

    注意事项包括序列化可能引发的安全问题和性能消耗,实现serialVersionUID以确保反序列化兼容性。 6. **线程**:线程是程序执行的最小单元,Java中通过Thread类或Runnable接口创建线程。线程状态包括新建、就绪、...

    java统计在线人数

    - 为了提高统计准确性,应考虑到可能存在的并发问题,确保增加和减少在线人数的计数操作是线程安全的。 以上就是通过`HttpSessionListener`统计在线人数的基本原理和实现步骤。在实际应用中,你可能还需要根据项目...

    用filter实现验证登录

    ### 注意事项 - 鉴权不应只依赖于`Filter`,还应配合其他安全机制,如Spring Security或Apache Shiro。 - `Filter`应避免执行耗时的操作,以免阻塞请求处理线程。 - 对于跨域请求,确保`Filter`正确处理`CORS`策略...

    AAS应用服务器用户手册

    - **应用打包和部署简介**:介绍了应用部署的一般流程和注意事项。 - **部署应用程序**: - **目录结构**:说明了应用部署时所需的文件夹结构。 - **准备工作**:部署前需要完成的任务。 - **自动部署**:支持将...

    POI导入Excel表格数据小例子

    #### 四、注意事项 - 在实际应用中,需要注意文件上传的安全性问题,例如文件大小限制、文件类型过滤等。 - 对于大量数据导入的情况,应考虑性能优化措施,如批量插入数据库。 - 单元格类型转换时需要处理特殊情况,...

    JAVA程序员面试题(1)\JAVA程序员面试题

    - **注意事项**: - 在进行编码转换前,需要确保源字符串的编码格式正确。 - 使用`trim()`方法去除转换后的字符串两端的空白字符。 - 异常处理中仅打印异常消息,实际应用中应根据具体情况做适当的错误处理。 ##...

    Java™ Servlet 规范.

    目录 前言 ............................... 3 其他资料 ......................................................................................................................................................

    Servlet3.1规范(最终版) PDF

    Servlet3.1规范(最终版) JavaTM Servlet 规范 版本 3.1(最终版) Shing Wai Chan Rajiv Mordani [作者] 穆茂强 张开涛 [译者] 2012年6月翻译 2013年7月修订 目录 前言 ..................................

Global site tag (gtag.js) - Google Analytics