[ソフト] Servlet はマルチスレッドで動作する

Servlet がマルチスレッドで動作するということは良く知られてる事です。しかしマルチスレッドで動くクラスでは、スレッド間で共有されるインスタンス変数の使用は充分な考慮が必要です、ということは案外と知られてなような気がする・・・

そもそもマルチスレッド・プログラミングの知識が広くは知られてないのかも



昨日は、あるお客様のところにトラブル対策に参加しました。リリースが間近なWebアプリが1ユーザーで使えばOKなのに、複数ユーザーで同時アクセスすると動きがおかしい。
最初からServletのマルチスレッド問題だな、と思ってソースを眺めていたのですが、Actionクラス(Strutsを使ってます) にはインスタンス変数は無い・・・
違う原因かなぁ〜? などとよくよくソースを見ると 継承してるのクラスは Strutsの Actionではなく、StrutsのActionを継承した独自クラスを使っています。

そのクラスのソースを見たら ”在りました!” インスタンス変数、しかも起きてる異常と充分に関連する情報を保持してます。


フレームワークのクラスを継承し、プロジェクトに共通な機能や便利な機能をそこに組み込んで使うのはオブジェクト指向としては、極めて まっとうな作りです。そうなるとインスタンス変数でいくつかの情報を持つとうのも自然な発想。
しかし、マルチスレッドで動く Servlet ではインスタンス変数は共有されるので、充分な考慮が必要、まあ使わないのが無難 ^^;

せっかくスマートに出来ていたプロジェクト固有のAction親クラスなのですがね・・・