Нет, объект Scala не подразумевает блокировку («синхронизирован» в java), поэтому клиенту 2 не нужно ждать. Оба клиента 1, клиент 2 и клиент n могут работать одновременно, если вы явно не добавляете блокировки в код.
Придумайте
object MyObject { ... }
в
class MyClass(..) { ... }
lazy val MyObject = new MyClass(..)
Замок может быть применен с 'синхронизированного' функции, например так:
def doQuery = synchronized {
..
..
}
== РЕДАКТИРОВАТЬ ==
Что касается вашего квеста ion в комментарии, стек потоков (или вызовов) и обмен переменных не имеют ничего общего с вашим контроллером, используя неизменяемые ссылки и/или неизменяемые структуры данных. Важно то, где вы определяете свои переменные. Если вы определяете переменную, будь то val или var, внутри метода (переменной метода), то каждый раз, когда вызывается метод, эта переменная создается только для вызывающего потока. С другой стороны, если вы определяете свою переменную на уровне класса или объекта (переменная экземпляра), все вызовы метода экземпляра всегда используют одну и ту же переменную экземпляра.
В вашем случае, я думаю, вы можете реализовать свой контроллер как объект singleton, поскольку неизменяемые ссылки и структуры данных хорошо .. неизменяемы. Неважно, если они разделены или нет.
Поскольку я использую неизменяемые ссылки на неизменяемые структуры данных, тогда все вызовы функций будут выполняться в 'каждом потоке потока '? В результате я могу сохранить синглтон? –
Спасибо за добавление к вашему информативному ответу. –
Итак, в этом случае, если у нас есть что-то вроде этого 'объект MyObject { var a = 0; def bar() { a + = 1; } } '} Здесь, если клиент 2 вызывает MyObject.bar() после того, как клиент 1 вызвал тот же метод, тогда клиент 2 получит' a = 2' по сравнению с 'a = 1' для клиента 1? –