Scala: создание синглтона для обработки клиентского запроса - PullRequest
1 голос
/ 15 марта 2020

Полезно ли использовать одноэлементный объект для обработки клиентских запросов?

Поскольку экземпляр объекта является одноэлементным, и если он находится в середине обработки клиентского запроса, и в то же время поступает другой запрос, тогда тот же экземпляр вызывается с новыми данными клиента. Разве это не запутает?

Ответы [ 2 ]

3 голосов
/ 15 марта 2020

При использовании одноэлементных объектов мы должны гарантировать, что все внутри него, а также все, что он вызывает, должно быть поточно-безопасным . Например, javax.crypto.Cipher не кажется потокобезопасным, поэтому его, вероятно, не следует вызывать из одиночного кода. Рассмотрим, как guice использует @Singleton для указания намерения обеспечения безопасности потока:

@Singleton
public class InMemoryTransactionLog implements TransactionLog {
  /* everything here should be threadsafe! */
}

Также рассмотрим пример Play Framework, начальная версия которого 2.4 начала отходить от одноэлементных контроллеров. и начал поощрять классовые контроллеры.

2 голосов
/ 15 марта 2020

Это зависит от того, содержит ли объект какие-либо изменяемые данные или нет.

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

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

Так что это хорошая практика, пока нет изменяемого состояния. Это хороший способ сбора связанных методов в одном и том же пространстве имен или создания глобальной функции (путем определения метода apply).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...