It seems that it is possible to launch several coroutines on same main thread of application. That's why it is possible to launch both invoke and invalidate at the same time even though they are marked as synchronized. To fix the issue this commit uses a concurrent collection instead of synchronization.