彼女/彼氏とは何かをプログラマ向けに解説してみる

彼女/彼女というのは、同期である。Java風に書けば

synchronized (she) {
   // このブロック内は付き合っている状態

   // 例えば自分を引数で渡して彼女と遊ぶ
   she.play(this);

   // ...
}

となる。


Threadがこのsynchronized句の内側を実行している状態を「付き合っている」と言う。
synchronizedでロックの取得を試みることを「告白する」と言う。


ロックの取得を試みた際、IllegalMonitorStateExceptionがthrowされてロックの取得に失敗することがある*1


あるいは、すでに先行してロックを取得しているThreadがある場合、ロックの取得がブロックされて待たされることがある*2
状況によってはデッドロックに陥って動けない状況になるかもしれない。


例ではsynchronizedによる同期を示したが、同期のどのように取られるかは実装による*3

読み書きを厳密にロックするのではなく、読みこみ同士は並列に動作可能なjava.util.concurrent.locks.ReadWriteLockを用いた実装になっているかもしれない*4

あるいは、ロックはされずvolatileキーワードによるメモリの同期しかされていないかもしれない。
もっと杜撰であれば、スレッドセーフではなく、マルチスレッド下で深刻な例外を発生させる問題のある作りになっているかもしれない*5


同期のミスによるバグを恐れるのであれば、ステータスはimmutableにしておく方が良い。
思い出が同じメモリであると、同期のミスがあった場合に手痛い思いをすることになる。スコープは明確に分かれていることが望ましい*6


いずれにせよスレッドがシングルである場合は、これら同期に伴う厄介な問題と遭遇することはない*7

*1:つまり、振られることがある

*2:今の彼氏と別れるから、という約束を取り付けられたような場合

*3:人によっては厳密に同期されるかもしれないし、実装がいい加減で浮気がちな人もいることだろう

*4:読み込み/書き込みが何を意味するかは想像にお任せする

*5:スレッドセーフではない作りというのは、単にマルチスレッド下で問題が起こるということに無知である場合も多い

*6:うっかり前の彼女との思い出(メモリ)と混同すると致命的な障害をもたらすかもしれない

*7:マルチスレッドは厄介でシングルはそうした問題から解放されると言う点で気楽だ。同期によるロスも少ないので(金銭の)実行効率もよい