Я реализую одноэлементный класс в Java, чтобы убедиться, что создается не более одного экземпляра класса.Как сделать одноэлементный класс потокобезопасным?
ответ
Возможно, лучший способ - использовать перечисление с одним экземпляром. Это имеет дополнительное преимущество - быть сериализуемым и гарантировать односторонность в отношении сериализации и отражения, чего нет в «простой» реализации Singleton (частный? У меня есть отражение, я издеваюсь над вашими модификаторами доступа!). Это также очень прост в реализации:
public enum Singleton {
INSTANCE;
// fields and methods go here
}
Одиночные игры не являются потоковыми по умолчанию. Обычный способ создания синглета - иметь фабричный метод, который обрабатывает создание одного экземпляра. Таким образом вы можете управлять созданием экземпляра.
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton() { ... }
}
Использование переменной статического экземпляра предпочтительнее внутреннего класса «Держатель». Если вам нравится, вы также можете сделать статический член частным и предоставить метод для его доступа, но все, что делает, это добавить еще один вызов метода в стек.
Это скорее зависит от того, что вы пытаетесь достичь, как к тому, что является предпочтительным - держатель дает вам ленивый синглтон, тем проще версия не дает вам отложенной загрузки. –
Да, это так. Java не загружает классы до их первого использования. –
Не совсем верно. Он загружает их, когда они сначала ссылаются, например. в сигнатуре метода другого класса. – skaffman
Что касается ленивого запуска: getInstance() возвращает одиночный элемент или создает его, если это первый вызов.
public class MySingleton
{
private static MySingleton instance;
private MySingleton()
{
// construct object . . .
}
// For lazy initialization
public static synchronized MySingleton getInstance()
{
if (instance==null)
{
instance = new MySingleton();
}
return instance;
}
// Remainder of class definition . . .
}
Леновый экземпляр почти никогда не нужен, и если это так, Java загружает классы лениво, поэтому создание экземпляра в декларации фактически * является ленивой инстанцией - без накладных расходов на синхронизацию (в очень редких случаях это не достаточно лениво, а ответ скаффмана лучше) , –
Также обратите внимание, что эта реализация синхронизирует каждую попытку получения ссылки на экземпляр. Поскольку большинство кода будет делать что-то вроде: Singleton.getInstance.doSomething(); Singleton.getInstance.doSomethingElse(); Общий эффект будет дополнительной синхронизацией, строго ограничивающей параллелизм без гарантий безопасности потоков в терминах доступа/мутации члена. –
Двойная проверка блокировки в Java нарушена http://www.javaworld.com/jw-02-2001/jw-0209-double.html Короче говоря, этот способ гарантировать, что этот класс создается только один раз, может привести к трудно найти проблемы параллелизма. Никогда не используйте это. – Buhb
Лучший способ сделать синглтон? Используйте перечисление.
public enum Singleton {
INSTANCE;
public void foo(){ ... }
}
// Usage:
Singleton.INSTANCE.foo();
Вы получаете много помощи от VM не только избежать двойного экземпляра, но это также поможет вам избежать десериализаций коррупции.
Если вы беспокоитесь о параллелизме, вы не будете использовать общее глобальное состояние.
Если синглтон содержит накопление результатов от сингулярной распараллеливаемой задачи, почему бы и нет? Синглтон олицетворяет глобальное состояние, и поэтому он будет справедливым сценарием использования. –
Существует несколько вариантов использования для классов, представленных только с одним экземпляром, который разделяется между процессами.Типичный хорошо продуманный webapp с использованием пружины, вероятно, будет иметь кучу классов, созданных в одноэлементном пространстве, разделяемых между рабочими потоками. – Buhb
- 1. Как сделать статический класс потокобезопасным?
- 2. Как сделать класс оболочки Log4Net как одноэлементный класс?
- 3. Как создать одноэлементный класс
- 4. Как тестировать (TDD) одноэлементный класс?
- 5. Как сохранить/загрузить одноэлементный класс
- 6. Как сделать потокобезопасный одноэлементный класс, который может принимать параметр?
- 7. Как сделать одноэлементный класс с сервером fastcgi Python Flup?
- 8. Почему одноэлементный класс трудно тестировать?
- 9. расширяет одноэлементный класс в PHP
- 10. Как сделать мой счет потокобезопасным?
- 11. статический одноэлементный класс становится нулевым
- 12. JavaScript - Что такое одноэлементный класс?
- 13. Класс связи с базой данных как одноэлементный
- 14. Как обернуть одноэлементный класс с помощью pybind11?
- 15. Как создать одноэлементный класс с использованием enum
- 16. Как настроить одноэлементный класс в качестве делегата?
- 17. Как сделать рекурсивный вызов (getTotalFiles) потокобезопасным?
- 18. Является ли этот класс потокобезопасным?
- 19. Является ли этот класс потокобезопасным?
- 20. Как класс String является потокобезопасным в java?
- 21. Создайте одноэлементный класс для доступа к ServiceSecurityContext.Current.WindowsIdentity
- 22. Невозможно использовать одноэлементный класс вернуть свои свойства
- 23. Сделать доступ к словарю потокобезопасным?
- 24. Как сделать список потокобезопасным для сериализации?
- 25. Как сделать JavaFX потокобезопасным с Platform.runLater
- 26. Как сделать BeanPropertyRowMapper потокобезопасным в SpringJdbc?
- 27. Как перепроектировать это, чтобы сделать его потокобезопасным?
- 28. Как сделать строительный блок приложений потокобезопасным?
- 29. переменные состояния сеанса и одноэлементный класс
- 30. Проверьте, имеет ли объект одноэлементный класс
+1 за издевательство над модификаторами доступа. Я lol'd. :) – corsiKa