Лучше использовать структуру данных thread-safe
, atomic
для ваших электронных писем, чем устанавливать synchronized
в каждом из методов обновления.Синхронизация использует механизм ОС lock
, который является дорогостоящей операцией, и ее следует избегать.
Я бы использовал ConcurrentLinkedQueue
(пример ниже).
Относительно самого класса - Lazy-Initialization шаблон проектирования для поточно-ориентированного синглтона также может быть хорошим решением.
В вашем случае он имеет в основном "за":
- Вы избегаетеиспользование
synchronized
в getInstance()
- Немного улучшает время запуска
- Потокобезопасен:)
Редактировать: Взгляните на эту статью , чтобы лучше понять, почему эта реализация является поточно-ориентированной.@Rafael сделал хорошее замечание: ленивая инициализация сама по себе не обязательно означает безопасность потоков.
После того, как все сказано и сделано, вот реализация:
public class RecycleStation {
private static RecycleStation uniqueInstance; //You don't need `volatile` here
private static ConcurrentLinkedQueue<Email> recycleEmailList;
// Here it all begins:
private static class SingletonHolder {
private static RecycleStation instance = new RecycleStation();
}
public static RecycleStation getInstance() {
return SingletonHolder.instance;
}
private RecycleStation () {
recycleEmailList = new ConcurrentLinkedQueue<>();
}
// class functions:
public void RecycleEmail(Email email) {
recycleEmailList.add(email);
}
public void deleteEmail(Email email) {
recycleEmailList.remove(email);
}
public void clear() {
recycleEmailList = new ConcurrentLinkedQueue<>();
}
}