可以通过使用 synchronized 关键字来实现多线程加载类时只执行一次静态代码块的效果。可以在静态代码块前加上 synchronized 关键字,并在静态变量中添加一个标志位来判断是否已经加载过。以下是一个示例代码:

public class MyClass {
    private static boolean isLoaded = false;

    static {
        if (!isLoaded) {
            synchronized (MyClass.class) {
                if (!isLoaded) {
                    if (System.getProperty('os.name').toLowerCase().substring(0, 3).equals('win')) {
                        System.load('D:\syySdfHsm\msvcr110.dll');
                        System.load('D:\syySdfHsm\libeay32.dll');
                        System.load('D:\syySdfHsm\ssleay32.dll');
                        System.load('D:\syySdfHsm\sdfapi_x64.dll');
                        System.load('D:\syySdfHsm\syySdfHsm.dll');
                    } else {
                        System.loadLibrary('syySdfHsm');
                    }
                    isLoaded = true;
                }
            }
        }
    }

    // 其他类成员及方法
}

在上述代码中,isLoaded 变量用来判断是否已经加载过静态代码块。使用 synchronized 关键字将静态代码块包裹起来,确保在多线程环境下只有一个线程可以进入加载代码块。


原文地址: https://www.cveoy.top/t/topic/qqLH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录