如何解决Checkmarx检测到的Unsynchronized_Access_to_shared_data问题?
首先明确:Java程序的main方法默认只会被JVM调用一次,理论上不存在并发执行的场景,但Checkmarx的静态分析会将类级静态变量判定为共享资源,因此触发了竞态条件告警。针对你的代码,可通过以下几种方式解决:
方案1:将变量改为局部变量(优先推荐)
如果mainThreadClassLoader和context不需要在main方法外被其他代码访问,直接把它们改成局部变量,彻底消除共享资源的问题:
public static void main(String[] args) { ClassLoader mainThreadClassLoader = Thread.currentThread().getContextClassLoader(); ApplicationContext context = SpringApplication.run(DemoApplication.class, args); // 后续仅在main方法内使用这两个变量 }
方案2:用volatile修饰静态变量
如果这两个变量需要被其他线程读取,添加volatile关键字保证变量的可见性,避免其他线程读取到旧的缓存值:
// 类级变量定义 private static volatile ClassLoader mainThreadClassLoader; private static volatile ApplicationContext context; public static void main(String[] args) { mainThreadClassLoader = Thread.currentThread().getContextClassLoader(); context = SpringApplication.run(DemoApplication.class, args); }
volatile会禁止JVM对变量的读写操作进行指令重排,同时确保变量的修改对所有线程可见。
方案3:添加同步块(适配工具检测)
如果只是为了满足Checkmarx的检测规则,可给变量赋值操作加上类级别的同步块:
public static void main(String[] args) { synchronized (DemoApplication.class) { mainThreadClassLoader = Thread.currentThread().getContextClassLoader(); context = SpringApplication.run(DemoApplication.class, args); } }
虽然main方法不会并发执行,但同步块可以让静态分析工具认为共享资源的访问是线程安全的,从而消除告警。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

