vksdk / vk-sdk-kotlin

Unofficial VK SDK, written in Kotlin: make bots, use the API
https://vksdk.github.io/vk-sdk-kotlin
MIT License
70 stars 16 forks source link

Небезопасное обращение к queue из разных потоков #2

Closed sleepytomcat closed 7 years ago

sleepytomcat commented 7 years ago

Объект queue используется из потока UpdatesHandler (в методе run) и из основного потока (посредством вызова UpdatesHandler.handleCommands(..) ).

https://github.com/petersamokhin/vk-bot-java-sdk/blob/2f38387ce4668f537df3fefcafc4dda7993a0b69/src/main/java/com/petersamokhin/bots/sdk/longpoll/UpdatesHandler.java#L40

https://github.com/petersamokhin/vk-bot-java-sdk/blob/2f38387ce4668f537df3fefcafc4dda7993a0b69/src/main/java/com/petersamokhin/bots/sdk/longpoll/UpdatesHandler.java#L49

При этом сласс Queue сам по себе не является синхронизированным, а данные в нем хранятся в ArrayList<>, который так же не является потокобезопасным. https://github.com/petersamokhin/vk-bot-java-sdk/blob/2f38387ce4668f537df3fefcafc4dda7993a0b69/src/main/java/com/petersamokhin/bots/sdk/longpoll/Queue.java#L16

Таким образом во время работы программы велика вероятность разрушения данных.

petersamokhin commented 7 years ago

Не поверите, в данный момент дописал уже 90% новой версии библиотеки. Проблема работы с потоками и сохранением быстроты работы была основной.

Полноценно добавлена работа с java.util.concurrent пакетом, работа с библиотекой теперь полностью потокобезопасна, сейчас провожу рефакторинг.

На конкретике: ранее были проблемы с утечками памяти, создавалось много лишних потоков, особенно, как раз, при обработке новых сообщений. Сейчас вместо потоконебезопасных List и ArrayList используется полностью потокобезопасный CopyOnWriteArrayList.

Теперь задержек при обработке событий при лонгполлинге не будет абсолютно, и в то же время утечек памяти тоже!

Помимо фикса крупных багов, также пофикшено множество мелочей и добавлено ещё немного полезного функционала.

Спасибо!

petersamokhin commented 7 years ago

Обновил библиотеку, поправлены все замеченные баги, производительность улучшена в разы, добавлен некоторый новый функционал. Вся нужная информация есть в javadoc, а документацию тут обновлю попозже.