>つまり、put mVar したあと、誰も take mVar しないと、永遠に put mVar が
>失敗しますよね? 例えば、shareVar を mVar として、
それはその通りです。

おそらく、疑問の出発点は、mVarって何が嬉しいねん? という事でしょう。

mVar は「値を参照・それを元に新しい値の生成・それを書き込む」という一
連の手順を保証するのに適しています。あるスレッドが変数 m に対して

sync $$ mVar.put m $$ calc_new_value $$ sync $$ mVar.take m

したとします。仮に他のスレッドがこの処理の途中で同じような処理をしよう
としても、値が無いので、新しい値が書き込まれるまで待たされます。つまり、
「値を参照・それを元に新しい値の生成・それを書き込む」という一連の手順
は、必ず順番に行われるよう保証されます。

要は mVar は参照したら必ず更新する変数を意図しているのです。ちなみに、
272で示した「一度書き込んだら参照だけ何度も可能で、二度と書き込めない」
変数は iVar と呼ばれ、データの受渡しやStreamの実装など、幅広く使える変
数です。