use volatile on atomic write and read fields

This commit includes further changes, such as removal of locking the calling thread. Actually, this has no effect, since the calling thread is already blocked by executing activate(). Synchronization is a policy and threads need to synchronize on the same resource in order for the synchronization to be effective.