我遇到了问题。 我在我的Project中使用Spring MVC框架,但Spring MVC默认Controller是Singleton Model。 我通过会话更改Controller使用@Scope(“会话”)以避免竞争条件问题(每个人都有自己的控制器)。
@Controller
@Scope("session")
public class AP0Controller extends BaseController {
@Autowired
GnRecService gnRecService;
Integer seq = null;//Global variable
@RequestMapping(value = "/agn/AP1W01A_004", method=RequestMethod.GET)
public ModelAndView welcomeGrid(@RequestParam("payType")String payType){
seq = gnRecService.findTheLastPK(payType);
ModelAndView view = new ModelAndView(".agn.AP1W01A_004");
return view;
}
public ModelAndView showPk() {
seq +=2;
ModelAndView view = new ModelAndView(".agn.AP1W01A_004");
view.addObject("seq",seq)
return view;
}
}
HP Fortify扫描后,报告显示这将导致竞争条件。 我该如何解决并传递问题?
seq +=2;//Race Condition: Singleton Member Field
答案 0 :(得分:0)
尝试重新设计控制器,不要将状态置于其中。 或者,您可以考虑使用AtomicInteger
AtomicInteger seq = new AtomicInteger();//Global variable
@RequestMapping(value = "/agn/AP1W01A_004", method=RequestMethod.GET)
public ModelAndView welcomeGrid(@RequestParam("payType")String payType){
seq.set(gnRecService.findTheLastPK(payType));
ModelAndView view = new ModelAndView(".agn.AP1W01A_004");
return view;
}
public ModelAndView showPk() {
final int localSeq = seq.addAndGet(2);
ModelAndView view = new ModelAndView(".agn.AP1W01A_004");
view.addObject("seq",localSeq)
return view;
}
答案 1 :(得分:0)
当我们在类中声明一个实例变量并在同一类内的任何方法中使用该实例变量时,就会发生种族条件。
public class Test {
private boolean isRaceCondition;
private String myRaceCondition;
public void testMyMethod(){
If(isRaceCondition){
myRaceCondition= "Yes It is";
}
else{
myRaceCondition= "No It is not";
}
}}
以上代码将在单线程环境中正常运行,但是在多线程环境中,可能有多个线程在同一段代码上工作,并可能导致数据完整性问题。
例如,线程T1将isRaceCondition =的值设置为true,但在T1可以执行方法testMyMethod()之前,另一个线程T2将isRaceCondition =的值重置为false,因此现在当T1尝试执行testMyMethod()时,它将看到isRaceCondition为false,它将设置myRaceCondition =“否,不是”;
要解决此问题,最简单的解决方案是 如果我们可以将初始值设置为变量,并且基本上它们是恒定的。
private static final boolean isRaceCondition=True;
private static final String myRaceCondition="Yes It is" ;
否则,如果我们无法设置初始值,则使用 volatile 。这样可以确保始终在使用变量之前先从内存中获取变量的值
private static volatile boolean isRaceCondition;
private static volatile String myRaceCondition;
答案 2 :(得分:0)
对于String和其他对象竞争条件,我们应该使用AtomicReference竞争条件。例如,私有AtomicReference名称,并为用户定义的对象AtomicReference人生成setter和getter,并类似地为您的竞争条件生成setter和getter。