K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2059] info.servlet.serviceについて
投稿者:くまきち
2017/12/18 22:54:13

いつもお世話になっております。おかげさまで安心して読み進めることが出来ます。 『基礎からのWebアプリケーション開発入門』のP.116のリスト3-17の76行目に info.servlet.service(req,resp); という行があります。 この「info.servlet」はnullであれば53行目でインスタンスを作っています。 また「info.servlet」はWebapplicationのメンバーなので、当然、複数箇所から並行して呼ばれることがあるのではないかと思います。 分からないのは「info.servlet」がnullでなければ、同じインスタンスが使いまわされるのに、並行して複数個所から使いまわされていいんだっけ?ということです。 これは、マルチスレッド的な何か仕掛けがあって、このような作りになっているのでしょうか? 初心者で分からないことが多く、ご迷惑をおかけします。もしかして、ものすごく曖昧な質問なのかも知れませんが、よろしければお教えください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2060] Re:info.servlet.serviceについて
投稿者:(ぱ)こと管理人
2017/12/18 23:55:58

>分からないのは「info.servlet」がnullでなければ、同じインスタンスが >使いまわされるのに、並行して複数個所から使いまわされていいんだっけ? >ということです。 p.92の補足にも書きましたが、サーブレットのインスタンスはひとつだけ生成され、 すべてのリクエストで共有されます。 よって、インスタンスフィールドを使えば、複数のスレッド間で競合が起きる 可能性がありますし、(補足にも書いたように)リクエスト単位やユーザ単位で 持つべき情報をサーブレットのインスタンスフィールドで保持してはいけません。 ただし、ローカル変数はスレッドごとに存在するので、ローカル変数(メソッドの 引数含む)だけを使っている限り、同じインスタンスのメソッドを複数のスレッドで 呼び出すことは問題ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2063] Re:info.servlet.serviceについて
投稿者:くまきち
2017/12/19 21:37:28

なるほど、了解です!ありがとうございます。 ですが、もう少し分からないことがあります。 マルチスレッドで動くとなると、クラスがRunnableをimplementsして...のような ルールが必要なのかと思っていたのですが、HttpServletは、そのようになっていません。 HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも (結果として)マルチスレッドで動くという事なのでしょうか? 入門書を読め!という話なのかも知れませんが、どうぞ宜しくお願いします。 >>分からないのは「info.servlet」がnullでなければ、同じインスタンスが >>使いまわされるのに、並行して複数個所から使いまわされていいんだっけ? >>ということです。 > >p.92の補足にも書きましたが、サーブレットのインスタンスはひとつだけ生成され、 >すべてのリクエストで共有されます。 >よって、インスタンスフィールドを使えば、複数のスレッド間で競合が起きる >可能性がありますし、(補足にも書いたように)リクエスト単位やユーザ単位で >持つべき情報をサーブレットのインスタンスフィールドで保持してはいけません。 > >ただし、ローカル変数はスレッドごとに存在するので、ローカル変数(メソッドの >引数含む)だけを使っている限り、同じインスタンスのメソッドを複数のスレッドで >呼び出すことは問題ありません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2065] Re:info.servlet.serviceについて
投稿者:(ぱ)こと管理人
2017/12/19 23:08:47

>HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 >もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも >(結果として)マルチスレッドで動くという事なのでしょうか? もちろん、マルチスレッドの各スレッドから呼び出されるメソッドは 呼び出し元のスレッドで動きますから、マルチスレッドで動きます。 (クラスとかインスタンスは、この際関係ないですね)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2066] Re:info.servlet.serviceについて
投稿者:くまきち
2017/12/19 23:31:05

ありがとうございます、納得しました! >>HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 >>もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも >>(結果として)マルチスレッドで動くという事なのでしょうか? > >もちろん、マルチスレッドの各スレッドから呼び出されるメソッドは >呼び出し元のスレッドで動きますから、マルチスレッドで動きます。 >(クラスとかインスタンスは、この際関係ないですね) >
[この投稿を含むスレッドを表示] [この投稿を削除]