首页 > 解决方案 > 这种单例线程的实现是否安全、无序列化问题且性能良好?

问题描述

我有一个将其当前状态保存在枚举中的单例。我想确保这个实现是线程安全的,没有序列化问题并且是高性能的。它用于中央配置并在运行时动态更改配置。请任何人指出您可以找到的任何问题。我意识到同步块可能会减慢对内部枚举值的访问。

set 操作并不经常调用,可能一天一次,但 get 操作每小时调用 200-600 次。

我尝试使用访问枚举中的值和设置值的不同线程运行它。

import java.io.Serializable;

public class ProviderSingleton implements Serializable {

    private static final long serialVersionUID = -6827317560255793250L;
    private static volatile EmailProvider emailProvider;
    private static ProviderSingleton instance = new ProviderSingleton();

    private ProviderSingleton() {
        System.out.println("Singleton(): Initializing Instance");
        emailProvider = EmailProvider.SMTP; // the default
    }

    public static ProviderSingleton getInstance() {
        return instance;
    }

    public String getEmailProvider() {

        synchronized (ProviderSingleton.class) {
            return emailProvider.name().toString();
        }
    }

    public void setEmailProvider(String emailProviderValue) {

        synchronized (ProviderSingleton.class) {
            emailProvider = EmailProvider.valueOf(emailProviderValue);
        }

    }

    // This method is called immediately after an object of this class is
    // deserialized.This method returns the singleton instance.
    protected ProviderSingleton readResolve() {
        return getInstance();
    }

    enum EmailProvider {
        SMTP, POP3;
    }
}

我想通过代码示例指出问题或提出改进建议。

标签: javaenumsconfigurationsingleton

解决方案


推荐阅读