You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Checkmarx检测到的Unsynchronized_Access_to_shared_data问题?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:50:23