2013-11-12 2 views
5

С помощью play мой контроллер вызывает услугу Foo, объект . Этот объект, который использует только val и immutable data structures, будет вызываться несколькими клиентами.Scala Singleton Объект с многопоточным

Когда мой контроллер вызывает Foo.doQuery() в нескольких потоках, что произойдет?

Если клиент 1 делает вызов, который выполняет Foo.doQuery(), будет ли запрос клиента 2 на Foo.doQuery() должен подождать?

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

ответ

9

Нет, объект Scala не подразумевает блокировку («синхронизирован» в java), поэтому клиенту 2 не нужно ждать. Оба клиента 1, клиент 2 и клиент n могут работать одновременно, если вы явно не добавляете блокировки в код.

Придумайте

object MyObject { ... } 

в

class MyClass(..) { ... } 
lazy val MyObject = new MyClass(..) 

Замок может быть применен с 'синхронизированного' функции, например так:

def doQuery = synchronized { 
    .. 
    .. 
} 

== РЕДАКТИРОВАТЬ ==

Что касается вашего квеста ion в комментарии, стек потоков (или вызовов) и обмен переменных не имеют ничего общего с вашим контроллером, используя неизменяемые ссылки и/или неизменяемые структуры данных. Важно то, где вы определяете свои переменные. Если вы определяете переменную, будь то val или var, внутри метода (переменной метода), то каждый раз, когда вызывается метод, эта переменная создается только для вызывающего потока. С другой стороны, если вы определяете свою переменную на уровне класса или объекта (переменная экземпляра), все вызовы метода экземпляра всегда используют одну и ту же переменную экземпляра.

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

+0

Поскольку я использую неизменяемые ссылки на неизменяемые структуры данных, тогда все вызовы функций будут выполняться в 'каждом потоке потока '? В результате я могу сохранить синглтон? –

+0

Спасибо за добавление к вашему информативному ответу. –

+0

Итак, в этом случае, если у нас есть что-то вроде этого 'объект MyObject { var a = 0; def bar() { a + = 1; } } '} Здесь, если клиент 2 вызывает MyObject.bar() после того, как клиент 1 вызвал тот же метод, тогда клиент 2 получит' a = 2' по сравнению с 'a = 1' для клиента 1? –

Смежные вопросы