Синглтон и многопоточность

130
30 марта 2018, 12:23

Помогите, пожалуйста, разобраться в вопросе. Есть, к примеру, класс синглтон

 class singleton {
   ...здесь инициализация синглтона
   public Date getDate(Date date) {
   return calculateDate(date);
   }
   private Date calculateDate(Date date) {
   Date date = new Date();
   ...здесь определенный алгоритм
   }
}

Как он будет работать в многопоточном режиме когда вызов паблик метода getDate() будет одновременно осуществляться с разных потоков? Предположим приватный метод calculateDate() выполняется долго и много потоков одновременно могут вызывать его. Безопасно ли это?

Answer 1

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

Одно из классических решений проблемы многопоточности - иммутабельность, когда объекты нельзяа поменять. А значит пишущего потока быть не может, значит нет состояния, собственно проблемы разделяемых состояний тоже.

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

private Date calculateDate(Date date) {
    Date date = new Date(date.getTime());
    ...
}

Плюс у вас почему в параметр пишется новое значение сразу же, что делает код вообще безопасным полностью, но я так понимаю это просто опечатка )

Если же вы начнете что либо писать в параметр или поля класса - тогда нужно будет думать о многопоточности.

READ ALSO
Spring MVC Cannot initialize context because there is already a root application context present

Spring MVC Cannot initialize context because there is already a root application context present

После правок относительно этого вопроса Ошибка A ServletContext is required to configure default servlet handling при попытке подключить Spring Security, добавления аннотации...

158
ключевой объект HashMap

ключевой объект HashMap

Что будет, если попытаться вставить в HashMap уже имеющийся в ней ключевой объект?

128
Java Объекты. Производительность. Различия

Java Объекты. Производительность. Различия

Дано: Класс у которого прописаны множество функций(без создания дополнительных объектов)Один из других классов каждую секунду вызывает...

158
Когда удаляется session bean?

Когда удаляется session bean?

Cоздал сессионный бин и идея такова, что когда сессия истекает я вызываю метод connectionClose(); чтоб закрыть соединение к базев сервлете установил...

128