質問: 掲示板の皆様、お世話になっております。 HttpServletもしくはEventListenerのサブクラスで宣言したメンバー変数及び定数は、複数の接続ユーザーから参照される可能性がある。 まずはこの認識に間違いはないでしょうか? その上で以下、僕の認識に誤りがないか、ご指摘をお願いします。 ・HttpServletもしくはEventListenerのサブクラスの全てのメンバー変数及び定数は参照される。 ・HttpServletもしくはEventListenerを継承していないクラスでも、static修飾子のついたメンバ変数及び定数は参照される。 ・HttpServletもしくはEventListenerを継承していないクラスの、staticではないメンバ変数及び定数は、アクセス修飾子に関係なく参照されない。
回答: 全体的に対比させているAとBの対象性が...だが、とりあえず通常のServletに関してはちゃんと把握できてると思うのでそこはOK。 >CGIのようにアクセスの都度プロセスを立ち上げた場合、アクセス人数が増えると処理が追い付かなくなります。 プロセスを立ち上げる話はどこから。 特定のServletが、 Date a=new Date();Date b=new Date(); のaとbのように複数インスタンスになる(つまり1)「こともある」という話(多分世の中のアプリの99%以上は単一なんだろうけど)。 >2に属するクラスであっても、スレッドセーフに設計していれば実質的に1になる。 >逆に本来1に属するクラスでも実装によってはいろんな実行単位に意図せず変数を書き換えられる変なWEBシステムになるということですね。 マルチスレッドにおいてスレッドセーフはもちろん重要な要素だけど、今の論点とはレイヤーが違う。 なんらかの情報を、「意図的に」実行単位をまたいで共有させる場合もあり、 それを通常のServletと同様に単一のインスタンスをすべての実行単位から参照する(つまり2)ことで実現する、という話。 Servletという存在を、なにか特別視していないだろうか。 Servletはただそういう機能をもったJavaのクラスの1つで、インスタンス、あるいはスレッドとの関係という意味ではほかのどんなクラスとも変わらない。