Пишу очередную реализацию ФРП.
На некий сабджект можно подписаться и отписаться. Здесь...
val a = concurrentMutablePropertyOf("hello")
val b = a.map(String::toUpperCase)
...значение b вычисляется из значения a, т. е. b должен быть подписан на a. Но имеет смысл подписываться только тогда, когда на b тоже хоть кто-нибудь подписан, в противном случае лучше стать добычей для сборщика мусора.
Добавление/удаление подписчиков отлично работает параллельно, с помощью CAS. Но когда подписывается первый, надо подписаться на оригинал, а когда последний отписывается, надо отписаться. И если кто-то будет дрочить подписку/отписку первого подписчика под гонкой, есть большая вероятность неправильно подписаться/отписаться, поэтому это единственное место, которое не lock-free.