gpt4 book ai didi

java - 如何修复 Fortify 竞争条件 : Singleton Member Field issue

转载 作者:搜寻专家 更新时间:2023-11-01 03:47:57 27 4
gpt4 key购买 nike

我遇到了一个问题。我们在我的项目中使用 Spring MVC 框架,但 Spring MVC 默认 Controller 是单例模型。我通过 session 更改 Controller 使用 @Scope("session") 以避免竞争条件问题(每个人都有自己的 Controller )。

@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 扫描后,报告表明这将导致 Race Condition。我怎样才能解决它并通过问题?

seq +=2;//Race Condition: Singleton Member Field

最佳答案

当我们在一个类中声明一个实例变量并在同一类中的任何方法中使用该实例变量时,就会出现竞争条件。

 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=“No It is not”;

要解决这个问题,最简单的办法是如果我们可以将初始值设置为变量并且本质上它们是常量。

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;

关于java - 如何修复 Fortify 竞争条件 : Singleton Member Field issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38757923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com