Что это за синглтон?

public class ConnectionManager {

    private static Map <String, ConnectionManager> managerInstances = new HashMap<String, ConnectionManager>();

    private String dsKey;
    private ConnectionManager(String dsKey){
        this.dsKey = dsKey;
    }

    public static ConnectionManager getInstance(String dsKey){
        ConnectionManager managerInstance = managerInstances.get(dsKey);

        if (managerInstance == null) {
            synchronized (ConnectionManager.class) {
                managerInstance = managerInstances.get(dsKey);
                if (managerInstance == null) {
                    managerInstance = new ConnectionManager(dsKey);
                    managerInstances.put(dsKey, managerInstance);
                }
            }
        }
        return managerInstance;
    }
}

Недавно я видел этот код где-то, где шаблон Singleton не использовался в соответствии с определением книги от GoF. Синглтон хранит Map своих экземпляров.

Какой синглтон это можно назвать? Или это допустимое использование Singleton?

2 ответа

Решение

Это не синглтон. Это называется мультитонный шаблон.

Вместо того, чтобы иметь по одному экземпляру на приложение, многотонный шаблон обеспечивает один экземпляр на ключ.

Этот мультитон кажется неработоспособным, поскольку использует дважды проверенную идиому блокировки, которая не является поточно-ориентированной в Java. В частности, при звонке getInstance(s), с s ненулевая строка, вы можете получить ненулевую ссылку, указывающую на ConnectionManager чья dsKey нулевой.

Было бы намного лучше использовать поточно-ориентированный ConcurrentHashMap и устранить необходимость синхронизации.

Другие вопросы по тегам