struts2 action 线程安全同步问题

问题描述

action在配置文件里的属性为:scope="prototype"在高并发请求一个action的时候,怎么解决数据不被重复验证!谢谢!在下面访问的时候出现都修改了数据public String threadTest(){HttpServletRequest request = ServletActionContext.getRequest(); product = productService.getProduct(11440);if(product.getStatus()==1){System.out.println(zhe+"==========jinru==========");try {Thread.sleep(10000*10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(zhe+"==========kaishi==========");if("11".equals(zhe)){System.out.println(zhe+(new Date()));System.out.println(product.getStatus());product.setStatus(3); //原来是1product.setBuyNum(1100); //原来是800product.setMaxQuantity(2100); //原来是1000productService.updateProduct(product);TradeArea ta = tradeAreaService.getTradeArea(11922);ta.setTradeName("1111");tradeAreaService.updateTradeArea(ta);System.out.println(zhe+(new Date())+"end");}else{System.out.println(product.getStatus());System.out.println(zhe+(new Date()));product.setStatus(4);//原来是1product.setBuyNum(1300);//原来是 800product.setMinQuantity(1123); //原来是123productService.updateProduct(product);System.out.println(zhe+(new Date())+"end");TradeArea ta = tradeAreaService.getTradeArea(11923);ta.setTradeName("11113333");tradeAreaService.updateTradeArea(ta);}} message=zhe; request.setAttribute("tipMessage", "../index.jsp"); return "message";}同时几个页面访问这个action的时候,数据都修改了,请问要怎么设置! 问题补充:chenxiang105 写道

解决方案

这个问题以前也看到过...prototype怎么变成singleton了
解决方案二:
这属于数据的查询并更新问题,要保证这一系列的操作在一个事务中完成。这个工作无法在web容器层面来完成,需要在数据库层面上进行。以mysql为例:首先为当前数据库操作添加事务,然后执行 select ... for update 语句查询你所需的数据,数据库会对查询到的结果进行加锁。再然后就可以放心地执行你的更新逻辑了。在此期间其他对被锁的记录的select ... for update以及更新,删除的请求都会阻塞,直到当前线程操作完成,提交事务或回滚以后才得以继续执行。从而保证数据的完整。
解决方案三:
单例就会这样...
解决方案四:
我之前也遇到过这种关于action的并发问题!我想,如果你使用的是集群服务器或者是多例的,那跟线程应该是没有关系的。我这边最后的解决办法是在数据库中加“锁”,这个锁不是数据库中的乐观锁那种操作,而是给你要操作的数据行加以限制,举例来说吧:现在表中有一条记录:ID STATUS NAME1 1 NAME1如果说有一个操作是修改STATUS为1的记录的NAME值为NAME2,那么SQL语句一般我们会这样写:UPDATE TABLE SET NAME='NAME2' WHERE STATUS=1;现在给这条SQL语句再加一个限制:UPDATE TABLE SET NAME='NAME2' WHERE STATUS=1 AND NAME='NAME1';这样就给记录加了一个锁,假如说现在有并发情况,用户A和用户B同时点击操作,总会有一个先操作,而一个后操作,那么先操作的会修改成功,而后操作的用户,因为NAME已经被第一个用户修改成NAME2,那UPDATE语句就执行失败了,这样就不会出现并发现象了。当然,这种操作需要在程序UPDATE前,先将要修改的字段值查询出来,然后作为限制条件加到SQL语句中。希望可以帮到你,我因为这个问题困扰了很久!
解决方案五:
引用我是想让2个方法都执行 不判断不就都执行了?? 能否说的清楚些?
解决方案六:
做判读为什么要传进去?设计什么?static{//利用这个可以在类第一次初始化时做一些操作,仅仅执行一次}静态变量也是个好办法
解决方案七:
首先 你的the用的就不能说明问题你用静态变量做判断应该是让你一次请求sleep, 然后第二次请求去修改数据 对吧static { the = true;}...if (the) {//是不是线程安全就看第二个对象会不会在此等待,和修改数据没关系 the = false; sleep....}这样当然会被第二次修改掉了.第二个请求是个新对象, 获得新的连接 修改数据库数据这个没什么问题啊这是两个对象,你sleep那个对象不会再第二个对象进来的时候还会去等待对象一sleep完 所以说每个对象都是新的. 第二个请求一旦进来就不会走if直接去修改了对象.struts2不建议我们做一些操作,你可以留意下. 当然也是针对想这样的问题
解决方案八:
还有你已经设置为scope="prototype",本身就是支持多线程了,不存在线程同步的问题
解决方案:
Struts2 的Action对象为每一个请求产生一个实例,因此虽然在Action中定义了很多全局变量,也不存在线程安全问题。 Struts2框架在处理每一个用户请求的时候,都建立一个单独的线程进行处理,值栈ValueStack也是伴随着局部线程而存在 的,在该线程存在的过程中,可以随意访问值栈,这就保证了值栈的安全性。你现在的这种测试方式,应该是对同一条数据进行更新的操作,因为数据库自身的锁机制,同一条记录不可能同时被修改的。跟struts2的线程安全没有关系。
解决方案:
你是不是用Spring管了,不要用单例
解决方案:
struts2 不是没有线程安全的考虑吗?每个请求都new了个新对象, 典型的牺牲点性能根源上解决问题的做法啊...跟你代码好像没什么关系.

时间: 2024-09-16 13:53:51

struts2 action 线程安全同步问题的相关文章

struts2.0-初学struts2 action问题,,求教

问题描述 初学struts2 action问题,,求教 输入http://localhost:8080/qiaoliang_demo/getBarcode 解决方案 感觉是包没导好,,,,NOTCLASSFOUND 解决方案二: Struts2的Action的线程安全问题struts2 action初始化参数问题struts2中JSP与Action间传值的问题 解决方案三: 不是一般都写failure的么(貌似这个没硬性要求),你肯定是execute方法里那一串貌似解析条形码的有问题,你应该贴c

多线程编程之四——线程的同步

八.线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决.例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误:又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过. 使隶属于同一进程的各

Java线程:线程的同步

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对 象上的数据. public class Foo { private int x = 100; public int getX() { return x; } public int fix(int y) { x = x - y; return x; } } public class MyRunnable implements

Java线程:线程的同步-同步方法

线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题? 在本文之前,请参阅<Java线程:线程的同步与锁>,本文是在此基础上所写的. 对于同步,在具体的Java代码中需要完成一下两个操作: 把竞争访问的资源标识为private: 同步哪些修改变量的代码,使用synchronized关键字同步方法或代码. 当然这不是唯一控制并发安全的途径. synch

Java线程:线程的同步-同步块

追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能. 在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题. /** * Java线程:线程的同步-同步代码块 * * @author leizhimin */ public class Test { public static void main(String[] args) { User u

struts2 action找不到404

问题描述 struts2 action找不到404 刚学习struts2,做到登录功能的时候登录按钮点击之后就显示action404的页面 我的工程结构是这样的 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.s

struts2 action的静态方法里,怎么获取国际化信息呢?

问题描述 struts2 action的静态方法里,怎么获取国际化信息呢? RT struts2 action的静态方法里,怎么获取国际化信息呢? 解决方案 http://blog.csdn.net/u014201191/article/details/44980071 这是我的博客链接,国际化问你你一看就明白了... 解决方案二: 在桌面,新建mess.txt文件,内容 user = 用户名 pass= 密码 等. 然后改后缀为 .properties (mess.properties文件)

在c#winform模拟四种页面置换算法时,怎么实现线程的同步,求指教

问题描述 在c#winform模拟四种页面置换算法时,怎么实现线程的同步,求指教 在模拟页面置换算法时,每种算法都可以实现,分别用了一个循环,关键问题是,要实现线程的同步,怎么做呢??? 解决方案 http://download.csdn.net/detail/skyuni/7444499 解决方案二: 还没有解决,求大神帮忙呀 解决方案三: 怎么定义线程才能让它在各个函数中都能使用....

android-Android线程间同步问题,实现主线程死等新线程处理结束

问题描述 Android线程间同步问题,实现主线程死等新线程处理结束 我的主线程是activity,在主线程里开启了线程R1,希望R1的任务处理完成后通知主线程继续,否则主线程一直等待,怎么实现? 解决方案 首先你这样的需求是违背android官方设计的,你应该考虑一下要实现你的功能,换一种需求(实现方式)是否可以. 主线程负责呈现画面增强交互,不应该阻塞,非要实现这样的功能, 可以在主线程是activity开启线程R1,然后什么事儿也不做,当R1的任务处理完成后通知主线程继续后再做事儿(绘制画