Литература и документация
- Java Concurrency in Practice (By Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bow beer, David Holmes, Doug Lea) - https://pdfs.semanticscholar.org/3650/4bc31d3b2c5c00e5bfee28ffc5d403cc8edd.pdf
- Пакет java.util.concurrent.
- Java docs: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html.
- Хорошее описание в статье https://habr.com/ru/company/luxoft/blog/157273/
Порядок изучения
Предполагается следющий порядок изучения:
- В Java Concurrency in Practice изучить часть I
- Решить задачи по коллекциям
- Изучение частей II и III из Java Concurrency in Practice поможет в решении задачи Шагающий экскаватор
- Далее можно обратить внимание на инструментарий из пакета java.util.concurrent.
- Решить задачу Управление счетами, потребуется обратиться к части IV книги Java Concurrency in Practice
- Далее можно попробовать решить задачу на Highload
Практика
Коллекции
- Реализовать потокобезопасную очередь блокировки реализующей интерфейс Queue (https://www.geeksforgeeks.org/blockingqueue-interface-in-java/)
- с использованием wait\notify
- с использованием интерфейса Lock
- свой вариант
- Реализовать потокобезопасный List с неблокирующим чтением и блокирующим изменением, то есть доступ к элементам коллекции блокируется если какой-то поток изменяет коллекцию (добавляет, меняет или удаляет элементы), иначе все потоки имеют доступ к элементам коллекции одновременно.
- c wait\notify
- c использованием интерфейса Lock
- c использованием ReadWriteLock
- свой вариант
Синхронизация потоков
Управление счетами
Вариант | Описание |
---|---|
1-й | Счет - сущность с двумя атрибутами
Транзакция или перевод - это перевод средств между счетами. Транзакция имеет три атрибута: сумма перевода, идентификатор счета с которого снимаются деньги, идентификатор счета, на который переводятся средства. Транзакция атомарна. Другие потоки не должны иметь доступа к счетам транзакции в момент выполнения транзакции. Задание:
|
2-й | К 1-му варианту добавим:
|
3-й | Меняем программу из варианта 1 или 2 таким образом, чтобы появлялись взаимные блокировки. Информационный поток должен дополнительно распечатывать взаимно заблокированные транзакции. |
Шагающий экскаватор
Решения использующие Thread.sleep не рассматриваются.
Вариант | Описание |
---|---|
Взаимодействие 2-х потоков | 1-й поток распечатывает свое имя и номер шага в консоль и передает поток управления 2-му потоку. 2-й поток распечатывает свое имя и номер шага в консоль и передает поток управления обратно. Для номера шага возможны варианты
|
Взаимодействие N потоков | Количество потоков параметризировано, то есть можно задать количество потоков, которые распечатывают шаги и передают поток управления следующему потоку, Последний поток передает поток управления 1-му. Шаги вычисляются также как и в первом варианте. |
Рандомизированный вариант | Реализовать сервис, который возвращает номер следующего потока (например статический метод, возвращающий случайное число) Условия такие же как и в варианте 2, только работающий поток дополнительно запрашивает номер следующего потока и передает управление ему. |
Highload
Ticks calculation
- 10.000-100.000 инструментов
- 50-500 индексов по 200 инструментов с весами
- 10.000 котировок в секунду
- Раз в секунду нужно рассчитывать значения индексов и сохранять слепок цен инструментов и значений индексов на данную секунду.
- Задержка обработки котировки не более секунды, т.е. котировка пришедшая позже секунды N должна попасть в слепок N+1
- Приложение должно проработать хотябы 1 час
Можно попробовать специфические вещи типа Disruptor или внешние кэши типа Hazelcast или Ehcache, но скорее всего не поможет.