AipoのWebメール受信におけるJavaのスレッドの排他制御

AipoのWebメールポートレットで、メールを受信中には”メール受信サーバに問い合わせ中です。”と表示されますが、 この状態を保持しているのに使っているALStaticObjectの振る舞いがよく分かっていなかったので調べました。


メール受信中かどうかは、

WebMailSelectData.getStatStr()
→ALPop3MailReceiveThread.getReceiveMailResultStr()
→ALPop3MailReceiveThread.isReceiving()
→ALStaticObject.getInstance().getAccountStat()

で判定されていて、このALStaticObjectにメール受信中かどうかの情報が保持されています。
ALStaticObjectは、synchronizedブロックを利用したsingletonオブジェクト(インスタンスが1つしか生成されないことが保証されたクラス)になっているので、マルチスレッドで共通の値を保持するために使えるようです。

しかしsingletonオブジェクトは万能ではなく、通常は別のプロセス間(や別のサーバー間)ではsingletonオブジェクトは同期されないそうです。

つまり、サーバーを冗長化している場合は、メール受信中のスレッドがあるかどうかを正しく判定出来ない可能性があるということになります。 ただし、アクセスを振り分けるロードバランサにはセッションを維持する機能があるので、同一セッションであれば正しく判定できそうです。 (逆に言うと、ログアウトしてログインし直すと正しく判定できなくなる恐れがあります)

参考(singleton , syncronizedに関して):
http://www.techscore.com/tech/Java/JavaSE/Thread/3-2/
https://www.sgnet.co.jp/java/java06_02.html

参考(プロセス間のsingletonオブジェクトの共有に関して):
http://qa.atmarkit.co.jp/q/4417
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=16419&forum=12&start=8

参考(サーバーの冗長化の仕組み):
http://beginners-network.com/slb.html
http://www.fujitsu.com/jp/products/network/security-bandwidth-control-load-balancer/ipcom/material/data/1/6.html