I&#x27;d say that Lefkowitz&#x27;s claims are mostly relevant when your runtime has no multicore support (like Python). If your runtime is single-threaded, explicit yields <i>might</i> (it&#x27;s mostly a matter of taste), make explicit reasoning about state-change ordering easier. But then you&#x27;re using shared-state concurrency again, and unsafe shared-state to boot. If your runtime has multicore support -- like Java or .NET -- all this doesn&#x27;t matter, because those concurrent changes Lefkowitz is talking about may happen any time -- not just at yield points.<p>The solution, of course, is not to use unsafe-shared-state-concurrency! Either use threads with messages (like Erlang), or threads with transactional shared-state, like Clojure, or both (in fact even Erlang has both actors and ETS, and Clojure has agents and channels as well as atoms and refs).