2

私のアプリケーションでは、Server クラスは起動時にロードされ、すべてのデータが一度にキャッシュされます。

これはシングルトン クラスであり、そのインスタンス変数は揮発性ではありません。

private static Server server;

findbug 分析の後、それを volatile に変更する必要があります (以下に表示)

public class Server {
    private static volatile Server server;

    public static Server getInstance(){
        if(server == null){
            synchronized (Server .class) {
                if(server == null){
                    try {
                        server = new Server(....);
                    } catch (IOException e) {
                        Logger.logError(MODULE, "IO Error while creating server home location: " + strServerHome);
                        Logger.logTrace(MODULE, e);
                    }
                }
            }
        }
        return server;
    }.......
}

しかし、スタック上の揮発性に関する記事と Q/A を読んだ後、揮発性はキャッシュではなくメモリから情報を読み取るため、揮発性はデータを再度ロードすると思います。

では、変数を揮発性にする必要がありますか?

volatile の場合、データを何度もロードする必要がありますか?

4

2 に答える 2

1

一般に、スレッドセーフなシングルトンを作成する最も安全な方法は、それを列挙型にすることです...

 public enum Server{
      INSTANCE;

      public Server getInstance(){
          return INSTANCE;
      }

      private Server(){...}

      // rest of methods here
 }

Singleton:Enum 方式

于 2013-09-26T10:49:06.787 に答える