powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает ReentrantLock?
25 сообщений из 30, страница 1 из 2
Как работает ReentrantLock?
    #39828531
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Получаю объекты из очереди ActiveMQ через MessageListener onMessage.
Сообщения накапливаются в ArrayList objectList.
При первом запуске onMessage запускается ScheduledExecutorService executorFlushSchedule. И по прошествии flushDBTimer секунд и если в objectList есть объекты, происходит сброс накопленных объектов в БД через метод flushToDB() и далее очистка objectList.
Получается общий ресурс objectList и 2 потока: метод onMessage и executorFlushSchedule.

Как в данном случае правильно поставить блокировку на objectList?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
@Override
    public void onMessage(Message message) {
        if (executorFlushSchedule == null) {
            executorFlushSchedule 
                    = Executors.newSingleThreadScheduledExecutor();
            executorFlushSchedule.scheduleAtFixedRate(
                    () -> {
                        if (objectList.size() > 0) {
                            flushToDB();
                        }
                    },
                    0,
                    flushDBTimer,
                    TimeUnit.SECONDS);
        }
        
        try {
            objectList.add((T) ((ObjectMessage) message).getObject());
        } catch (JMSException ex) {
            throw new RuntimeException(exceptionOnMessage, ex);
        }
    }
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828532
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

1) ReentrantLock тут не нужен
2) Необходима синхронизация при создании ScheduledExecutor (да и вообще - погуглите про double-checked locking)
3) Проще всего - обернуть List с помощью Collections.synchronizedList(), но я бы посмотрел в сторону реализаций BlockingQueue (add/offer для добавления, drainTo для получения записей для вставки)
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828534
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему ReentrantLock?

Вообще самый простой способ - это обернуть все обращения к objectList в synchronised блок
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828542
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch3) Проще всего - обернуть List с помощью Collections.synchronizedList()
P.S. Правда в этом случае есть подводные камни (например, нельзя использовать итератор), поэтому лучше или BlockingQueue или блоки синхронизации, как написали выше.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828550
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блокингкью для таких целей юзают.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828665
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, бум думать
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828682
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем ему еще одна queue?
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828815
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗачем ему еще одна queue?

это типа буфера, видимо, для bulk insert в базу.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828853
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинmaytonЗачем ему еще одна queue?

это типа буфера, видимо, для bulk insert в базу.имхо лишнее.
BlockingQueue читает вставляющий поток и вставляет.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828863
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архитектурно не вижу смысла. У кого есть строгое объяснение зачем нужна 2-я очередь - отпишитесь.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828871
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И по прошествии flushDBTimer секунд и если в objectList есть объекты, происходит сброс накопленных объектов в БД через метод flushToDB() и далее очистка objectList.

Не очень понятно, зачем вообще блокировка:

1. Заполняем ArrayList в потоке читателе-ActiveMQ
2. По накоплению нужного размера, передаем ЦЕЛИКОМ ArrayList в поток писатель-в-базу
3. Создаем новый ArrayList

Но. возможно, я просто чего-то не понимаю

IMHO
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828875
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevИ по прошествии flushDBTimer секунд и если в objectList есть объекты, происходит сброс накопленных объектов в БД через метод flushToDB() и далее очистка objectList.

Не очень понятно, зачем вообще блокировка:

1. Заполняем ArrayList в потоке читателе-ActiveMQ
2. По накоплению нужного размера, передаем ЦЕЛИКОМ ArrayList в поток писатель-в-базу
3. Создаем новый ArrayList

Но. возможно, я просто чего-то не понимаю

IMHO

мое мнение такое, что :
- тс использует достаточно надежный источник сообщений - activemq и беспокоится об их(сообщениях) сохранности
- тс использует надежное хранилище для сообщений
- тс вдруг хранит сообщения в arraylist, где может их потерять

Я скорее в этом логики не вижу. То есть, допустим, встваить данные не удалось? Что дальше то с ними делать? Надо обработку для этого придумать как минимум. Или outofmemory случился....
И все - 10000 событий исчезли и никто о них не узнает...
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828879
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот пункт непонятен.
Сообщения накапливаются в ArrayList objectList.
Накапливаются для чего?
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828880
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Если о BlockingQueue то там блокировка нужна чтобы при MAX 1000. Пищущий поток встал и не мог записать 1001-й.
Так как очередь вероятно никто не выгребает.
..
Тут как обычно всез собак вешают на слабое место.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828886
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpЕсли о BlockingQueue то там блокировка нужна чтобы при MAX 1000. Пищущий поток встал и не мог записать 1001-й. Так как очередь вероятно никто не выгребает.

AFAIK
Нормальные люди (не создатели Java), для этого используют Circle Ring Buffer. Но создатели Java, не позаботились реализовать его в java.util (((
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828904
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevPetroNotC SharpЕсли о BlockingQueue то там блокировка нужна чтобы при MAX 1000. Пищущий поток встал и не мог записать 1001-й. Так как очередь вероятно никто не выгребает.

AFAIK
Нормальные люди (не создатели Java), для этого используют Circle Ring Buffer. Но создатели Java, не позаботились реализовать его в java.util (((
Подобное реализовано в библиотеке Disruptor. И уже например используется в асинхронных логгерах Log4j2
при правильной настройке. Но я сомневаюсь что автору это нужно. Дизраптор создавался для высокочастотного
трейдинга.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828917
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинмое мнение такое, что :
- тс использует достаточно надежный источник сообщений - activemq и беспокоится об их(сообщениях) сохранности
- тс использует надежное хранилище для сообщений
- тс вдруг хранит сообщения в arraylist, где может их потерять

Я скорее в этом логики не вижу. То есть, допустим, встваить данные не удалось? Что дальше то с ними делать? Надо обработку для этого придумать как минимум. Или outofmemory случился....
И все - 10000 событий исчезли и никто о них не узнает...
вроде все понятно: у ТС spring-jms, который вычитывает сообщения по одному и отдает их в обработку, в связи с чем у ТС проблемы с производительностью (наверное просадка порядками исчисляется), поэтому он принял решение, что в базу их нужно вливать батчами, здесь очевидно, что задача не так решается: нужно батчами читать и батчами писать, а не изворачиваться хранением в памяти и потоками.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828926
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar вообще не говорит ничего про производительность. Остается только гадать где там узкое место.
Возможно - это предположение на основе его прошлых постов?

В любом случе нужны хоть какие-то цифры. И хотя-бы 2 эксперимента.
Чтение просто сообщений из ActiveMQ без записи в БД. И наоборот.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828927
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMolasar вообще не говорит ничего про производительность. Остается только гадать где там узкое место.
Возможно - это предположение на основе его прошлых постов?
Как ускорить запись в таблицу через JDBC?
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828929
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я помню это.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828930
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

в классе:
Код: java
1.
private final AtomicReference<List<?>> queue = new AtomicReference<>(new ArrayList<>());


при добавлении:
Код: java
1.
queue.get().add(object)


при записи в БД:
Код: java
1.
List<?> objects = queue.getAndSet(new ArrayList<>())
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39828931
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой нет, фигню написал
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39829889
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловmaytonMolasar вообще не говорит ничего про производительность. Остается только гадать где там узкое место.
Возможно - это предположение на основе его прошлых постов?
Как ускорить запись в таблицу через JDBC?
Я помню. Выложу цифры чуть позже.
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39829894
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинLeonid Kudryavtsevпропущено...

Не очень понятно, зачем вообще блокировка:

1. Заполняем ArrayList в потоке читателе-ActiveMQ
2. По накоплению нужного размера, передаем ЦЕЛИКОМ ArrayList в поток писатель-в-базу
3. Создаем новый ArrayList

Но. возможно, я просто чего-то не понимаю

IMHO

мое мнение такое, что :
- тс использует достаточно надежный источник сообщений - activemq и беспокоится об их(сообщениях) сохранности
- тс использует надежное хранилище для сообщений
- тс вдруг хранит сообщения в arraylist, где может их потерять

Я скорее в этом логики не вижу. То есть, допустим, встваить данные не удалось? Что дальше то с ними делать? Надо обработку для этого придумать как минимум. Или outofmemory случился....
И все - 10000 событий исчезли и никто о них не узнает...
Логика следующая:
1. Приложения кидают сообщения в очередь ActiveMQ
2. Слушатель ActiveMQ считывает сообщения по одному из очереди.
3. Если писать в базу по одному сообщению, то получается очень медленно. Поэтому приходится накапливать сообщения в списке и сбрасывать их по таймеру в БД как пакет Производительность увеличивается на порядок.
4. До комита в БД ловим эксепшены и возвращаем все сообщения в очередь.
А как по другому?
...
Рейтинг: 0 / 0
Как работает ReentrantLock?
    #39829915
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarЕсли писать в базу по одному сообщению, то получается очень медленно. Поэтому приходится накапливать сообщения в списке и сбрасывать их по таймеру в БД как пакет Производительность увеличивается на порядок.для пакетной записи не нужен таймер
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает ReentrantLock?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]