HttpSession的线程安全问题及注意事项[Java编程]
本文“HttpSession的线程安全问题及注意事项[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
HttpSession session = request.getSession();
List<Product> list = session.getAttribute("productCart");
myService.save(list); // 保存购物车数据到数据库
这个对象会被多次利用,也会被同一个用户的多个页面利用,所以他关于系统来说是线程不安全的.
比方用户在从产品列表里面挑选产品,这面挑选3种,他点了查看购物车
该用户还开了另一个页面,持续挑选产品.
此时,在显示购物车的页面,有大概运行在一半时,其已经挑选的产品列表,并另一个页面的操作改正了.所以显示的产品数目有大概并非3种.
因为session需求保持当前用户的信息,所以其在多个线程里是同享的.所以是线程不安全的.
不过,这个是表面现象,我们只要精确利用事件,保证数据的精确性,表面的问题可以不用管它.
我们可以把session里面的数据别的保存到一个新的数据对象里,这个对象不再因为session的改变而呈现变更.这个对象传送给业务层举行事件处理,保证数据级别的精确.
千万不要把session,大概 session里面的对象直接传送给业务层,因为你的业务处理一半时,一样大概呈现session对象被改变的情形.有大概造成重要数据呈现毛病.
举例:
session 对应三个产品,
事件里面循环了产品,并计算了总价钱,
计算完毕,预备保存时,session变了,产品变成了4个.
此时开始保存.产品保存了4个,可总价钱却还是3个的.
呈现了数据不一致.
改正后的例子
session 对应三个产品
重新生成一个产品对象数组,把session数据复制过来,然后传送给业务层
事件里面循环计算总价钱
计算完毕,此时session变了,但并不影响我们这个新的产品数组对象
保存,三个产品,价钱也精确.
HttpSession session = request.getSession();
List<Product> list = session.getAttribute("productCart");
List<Product> listNew = new ArrayList<Product>();
Product pNew;
for(Product p : list){
pNew = new Product();
pNew.setProductId(p.getProductId());
// 别的的复制参数的语句
listNew.add(pNew); // 保存到新的列表里面
}
myService.save(listNew); // 保存购物车数据到数据库,这个是安全的
总结:
有些线程安全问题是很躲藏的,等你出了问题,极大概根本不认为会是那边出的问题.记着一点,Java里面的对象传送的是对象的引用,只要2个地方用了相同的引用,则别的地方的变更,这一面也会变更.
原文:http://www.java2000.net/p9667
以上是“HttpSession的线程安全问题及注意事项[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |