Добрый день!
Задача
Допустим, есть 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
}
}
}
}