@furyon

Как правильно работать с CopyOnWriteArrayList?

Добрый день!

Задача
Допустим, есть web-страничка на которой пользователи делают действия. История действий записывается в переменную типа CopyOnWriteArrayList. Как только величина массива достигает 10-ти, мне нужно сохранить данные в БД.
Вопрос в том, как это правильно реализовать в условиях многопоточности. Я сделал так (но на это больно смотреть):

private val syncMinLimit = 10
private val userActions = CopyOnWriteArrayList<UserAction>()

fun addAction (action: UserAction) {
    userActions.add(action)

    // Условие перед synchronized чтобы постоянно не блокировать поток
    if (userActions.size >= syncMinLimit) {
        synchronized(userActions) {
            // Еще раз это условие, т.к. перед synchronized могла выстроиться очередь пока выполнялся код ниже
            if (userActions.size >= syncMinLimit) {
                val iterator = userActions.iterator()
                val removed = mutableListOf<UserAction>()
                while (iterator.hasNext())
                    removed.add(iterator.next())
                userActions.removeAll(removed)
                saveToDB(removed) // my function
            }
        }
    }
}
  • Вопрос задан
  • 435 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Допустим, есть web-страничка на которой пользователи делают действия. История действий записывается в переменную типа CopyOnWriteArrayList

Не совсем вас понимаю, как именно история действий записывается в переменую CopyOnWriteArrayList? А самое главное - зачем?

Может быть есть смысл сделать следующее:
записывать историю действий в localStorage браузера пользователя (средствами JavaScript), а далее по исстечению определенного времени или по нажатию кнопки "Сохранить" или еще какого-либо другого триггера сохранить все в БД.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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