now because we use Weak in ObserverBroadcast, we need at least one Arc somewhere else
use RwLock in ObserverBroadcast