Вопрос по – Как сделать поток кода безопасным в Scala?

4

У меня есть код в Scala, который по разным причинам содержит несколько строк кода, которые не могут быть доступны одновременно нескольким потокам.

Как легко сделать это потокобезопасным? Я знаю, что могу использовать модель Actors, но считаю ее слишком излишней для нескольких строк кода.

Я бы использовал какую-то блокировку, но я не могу найти конкретных примеров ни в Google, ни в StackOverflow.

Как показывают несколько ответов, несложно изменить код так, чтобы вам вообще не требовался критический раздел - это почти наверняка лучшее решение. Jed Wesley-Smith

Ваш Ответ

4   ответа
3

Семафоры, но я бы рекомендовал против этого, так как семафоры подвержены ошибкам и неудобны в использовании. Актеры действительно лучший способ сделать это здесь.

Создание актеров не обязательно сложно. На scala-lang.org есть краткое, но полезное руководство по актерам:http: //www.scala-lang.org/node/24

Добавил ссылку на хороший учебник для начинающих по актерам к моему ответу. evilcandybag
I делат понимаю актеров (немного). Я просто не уверен, как использовать это в моей ситуации. Должен ли я сделать весь объект с кодом актером? Это, вероятно, сломало бы больше вещей, чем нет, потому что это подклассы и вызовы, необходимые как обычные вызовы. Должен ли я создать еще один объект только с одним типом сообщения, который будет делать только этот короткий код? Возможно, это возможно, но, вероятно, слишком сложно. Karel Bílek
Как это легко сделать? У меня действительно есть простой код (который я могу, например, вставить в вызов процедуры), и я не хочу делать код слишком сложным. Во всем примере с актерами я хочу, чтобы я делал петли, получал сообщения и так далее, я думаю, что это немного излишне. Karel Bílek
Если вы действительно не хотите использовать актеров, возможно, вы захотите проверить это довольно хорошее руководство по параллелизму Java, в частности, мониторы: Baptiste-wicht.com / 2010/09 / ... evilcandybag
Я открыт для возможностей, я просто не уверен, как его использовать, вот и все:) Karel Bílek
15

что самым простым решением было бы использоватьsynchronized для критических секций (как в Java). Вот синтаксис Scala для этого:

someObj.synchronized {
    // tread-safe part
}

Его легко использовать, но он блокирует и может легко вызвать взаимные блокировки, поэтому я рекомендую вам взглянуть на Java.util.concurrent или Akka для, возможно, более сложных, но лучших / неблокирующих решений.

Вот и все, спасибо Karel Bílek
1

вы можете использовать синхронизированный:http: //www.ibm.com/developerworks/java/library/j-scala02049/index.htm

Или вы можете использовать некоторые классы из параллельного пакета в jdk:http: //docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.htm

Если вы хотите использовать актеров, вы должны использовать актеров akka (они заменят актеров scala в будущем), см. Здесь:http: //doc.akka.io/docs/akka/2.0.1. Они также поддерживают такие вещи, как FSM (конечный автомат) и STM (программная транзакционная память).

0

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

Похожие вопросы