Я прочитал Java-параллелизм на практике и у меня остался вопрос: когда я использую ConcurrentHashMap, о каких проблемах параллелизма данных, обсуждаемых в первой части книги, мне все еще нужно беспокоиться?Вот пара примеров из одной из моих программ:
1.Текущая позиция трейдера (общее целое число, где 'integer' - математический термин)
Это число представляет то, чем в данный момент владеет объект trader
, и определяет его состояние.Он должен прочитать свою позицию, чтобы знать, что делать (смотреть, чтобы начать новую позицию или управлять текущей).Методы Trader
выполняются в своем собственном потоке.
Объект broker
отвечает за установку позиции trader
.Он будет устанавливать позицию каждый раз, когда исполняется один из ордеров трейдера.Broker
методы выполняются в собственном потоке.
И trader
, и broker
находятся в одном пакете.Позиция реализована в виде пакета-приват static ConcurrentHashMap
.Ключи являются идентификаторами объектов трейдера.Значения являются целочисленными.
Внешним по отношению к пакету является приложение.Он получает позиции трейдеров косвенно с публичным добытчиком.
Позиции будут меняться не чаще, чем раз в несколько минут, поэтому broker
не будет часто касаться карты.Тем не менее, trader
и приложение будут часто читать.Кроме того, у нас часто есть несколько трейдеров, читающих карту одновременно.
Итак, используя ConcurrentHashMap таким образом, мне не нужно работать над блокировкой и видимостью данных?ConcurrentHashMap позаботится обо всем?
2.Рынок (bid, ask, последние цены)
Примерно такая же ситуация, что и позиция, за исключением того, что broker
будет очень часто обновлять цены (до 10 обновлений в секунду в часы занятости);обычно несколько раз в секунду).trader
и приложение по-прежнему часто читают.Ключи карты теперь являются кодами, указывающими, какой запас или будущее, а значения являются объектами, которые содержат рыночные цены.
Кажется, все работает нормально, но после прочтения JCIP я понимаю, что программу все равно можно сломать, если что-то не реализовано правильно.В книге рассказывается о ConcurrentHashMap, но явно не говорится, какие проблемы из части I нам больше не нужно решать вручную. кажется , что мне не нужно synchronize
ничего в этом случае.Это правильно?