• 締切済み

スレッドセーフについて

サーブレットの本にスレッドセーフを考慮してサーブレッドはプログラミングしろと書いてありました。 そこで疑問が発生しました。 1 JSPの場合はスレッドセーフって関係ないのですか? 2 Beanを使った場合そのBeanはスレッドセーフを考慮する必要があるのですか? よろしくお願いします。

  • gorou
  • お礼率45% (83/184)
  • Java
  • 回答数3
  • ありがとう数15

みんなの回答

回答No.3

サーブレットをスレッドセーフを考慮してコーディングする事は非常に重要です。JSPもサーブレットなので同様。 意識していないと、テスト時に一人でテストするぶんには問題なくても、複数の人で一斉テストした場合に「別人問題」が起こったりします。#1の方が示している問題です。私も経験しちゃいました。 サーブレットのインスタンスは1つしかありません。(これ重要) ですから、リクエスト毎に変化するオブジェクトをインスタンス変数なんかに定義してあると、別人問題が起こります。 JSPの場合も、<%! %>タグで定義したものはサーブレットのインスタンス変数となるので注意です。

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.2

1.JSPは最終的にはサーブレットに翻訳されて実行されます。 よってJSPだから自動的にスレッドセーフっていうのはNOが答えだと。 2. 考慮する必要があります。 ただしそのBeanがフィールドをもっていないのであれば必要ないです。(そんなことありえるのか!って感じですけどね)

gorou
質問者

お礼

回答ありがとうございました。

  • dayowl
  • ベストアンサー率56% (84/148)
回答No.1

私もこのご質問に回答できるほど十分なスキルは持ち合わせていないのですが。。。 ツッコミがあること覚悟で書いてみます。(汗) まず「スレッドセーフ」の意味としては、 「マルチスレッド環境下で正しく動作すること」ですよね。 http://www.atmarkit.co.jp/icd/root/10/86966010.html 1 JSPの場合はスレッドセーフって関係ないのですか? JSPの場合は、ユーザーからのリクエストごとに個々のスレッドが発生すると記憶しています。 ですから、そこに記述するスクリプトに対してスレッドセーフを考慮する必要は無いと思います。 しかし、JSPの中で使用するクラスについてはスレッドセーフを考慮する必要があります。 というか、スレッドセーフは個々のクラスについて考慮すべきことではないかと思います。 スレッドセーフについての参考URL http://www.tetras.co.jp/yada/j_java_thrd_r.htm http://www-6.ibm.com/jp/developerworks/java/040409/j_j-jtp09263.html 2 Beanを使った場合そのBeanはスレッドセーフを考慮する必要があるのですか? スレッドセーフは個々のクラスについて考慮すべきことだと思いますから「必要あり」です。 でも、その本に書かれていた「スレッドセーフを考慮せよ」というのは、もっと比較的簡単な話のような気がします。 つまり、非常に大雑把に言い換えると、 「変数のスコープに注意」とか、 「サーブレットの場合は、複数のユーザーからほぼ同時にリクエストが送られることがあるからフィールド変数を多用しないように」 という程度なんではないかなと思いました。 例えば、こんなサーブレットで。。。 public class ServletTest extends HttpServlet { String p1 = ""; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); String p1 = request.getParameter("POST_PARAMETER1"); String reault1 = getResult(p1); String reault2 = getResult(p1); out.println("POST_PARAMETER1 = " + p1); out.println("RESULT1 = " + result1); out.println("RESULT2 = " + result2); out.close(); } private String getResult(String param) { String result = new String(); ....(引数paramを使う何か時間のかかる処理) return result; } } 「p1」のようにクラス全体からアクセスできるフィールド変数は使っちゃダメですよね。 フィールド変数はマルチスレッド環境下で共有されますから、 ユーザーAからのリクエストを処理した直後にユーザーBのリクエストを受けたら、 ユーザーAのgetResultの処理中にp1の値がユーザーBからのリクエストの値に書き換えられてしまう可能性があるわけで、そうなると「result1」と「result2」の値が異なってしまう可能性がありますよね。 そのサーブレットの本では、そういうことが言いたかったんじゃないかと思う次第です。

gorou
質問者

お礼

詳しい回答ありがとうございました。 参考になりました。

関連するQ&A

  • スレッドセーフにするべきクラスについて。

    スレッドセーフにするべきクラスについて。 マルチスレッドで動くクラスはスレッドセーフにしなければならない。 とよく聞きます。ですが、どのクラスがマルチスレッドで動くのかどうかを判定する基準がよく分かっていません。 例えばサーブレットやJSP、Springでシングルトンにしたクラスなどは、スレッドセーフを意識しないといけないんだなと分かります。あとはThreadを拡張したクラスもそうなんだろうと思っています。 ただそれ以外のクラスでスレッドセーフを意識しなければならない場合、どこをみて判断すればよいのでしょうか?サーブレットから呼ばれるアクションクラスはスレッドセーフにしなければいけない・・・? そこのところがよくわかっていないため、クラスを作成する際にメンバ変数に状態を保持する変数を入れて良いんだろうかと悩んでしまいます。 申し訳ありません。アドバイスを頂けると嬉しいです。

    • ベストアンサー
    • Java
  • サーブレットのスレッド管理について

    はじめまして、現在Web Developperを目指し日々サーブレット,JSP, JavaBeansの勉強を続けております。お聞きしたいことは、サーブレット, JavaBeansのスレッド管理です。個人で勉強していると多数のクライアントが一つのサーバーにアクセスするなどという 環境をつくりずらいので、業務経験のあるかたからアドバイスをいただきたいです。 現在スレッドを管理する方法とて,SingleThreadModel インターフェイスの実装かsyncronizedコードを利用できることを知っております。 質問1. 実際のシステムで使われているスレッド管理もこの二つの方法で行われているのでしょうか? 質問2. JDBCよりデータベースに書きこむ部分は、二つのスレッドが同時にDBのデータを書き込まないように、shncronizedコードで囲まなくてはいけないと学びましたが、他の本でDBにはすでに同時アクセス を防ぐ仕組みがあるから、synchronizedコードを書かなくてもよいとかいてありました。どちらが正しいのでしょうか? 質問3. 業務のスレッド管理で主に気をつけなければいけないところは、DBとローカル変数がスレッドセーフになっていることでしょうか、他にも注意するべき点がありますでしょうか? 初心者の質問ですので、的を得ていないところが多々あると思います。それでも少しでも、技術者の方に近づければと思い質問させていただきました。もしよろしければご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、

    サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、 オブジェクト型のローカル変数にもそれは当てはまるのでしょうか。 例えば下記の実行クラスにユーザAとユーザBが同時にアクセスした場合、どうなるのでしょうか。 手順 (1)ユーザAが実行クラスのtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (2)その直後にユーザBがtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (3)ユーザAがセットした名前はユーザBに上書きされてしまうのか? ------------------------------------------------- ○実行クラス public class TestClass{   public String testMethod(){     TestBean testBean = new TestBean();     testBean.setName("テスト太郎");     return testBean;   } } ------------------------------------------------- ○呼び出されるBeanクラス public class TestBean{   private String name = null;     public void setName(String name){     this.name = name;   } } ------------------------------------------------- わかり難い説明で申し訳ないのですが、教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • JSP&sサーブレットを学習するための本

    JSP&サーブレットを勉強しようとしています。 ほんとに基礎的な知識はあります。 (@ITの基礎から学ぶサーブレット/JSPを読みました) 最適だと思われる本を紹介してください。 候補としては ・基礎からのサーブレット/JSP SE必修! ・はじめてのJSP&サーブレットプログラミング Eclipse3.1+J2SE5.0対応 TECHNICAL MASTER です。

    • ベストアンサー
    • Java
  • JSP/サーブレットについて

    Javaは本のタイトル「やさしいJava」という本で一通り勉強しました。 似たような本は沢山ありますよね。例えば「独習Java」や「Javaの絵本」や「新Java入門」や、本当に沢山ありますよね。    でも、これって殆ど仕事では使わないですよね?? 構文などは必要かもしれませんが、仕事では「JSP/サーブレット」の方が必要かなと思いました。 今、その「JSP/サーブレット」の参考書を使って勉強中なんですが、「やさしいJava」や「独習Java」や「Javaの絵本」とは全然違います。 しかも、全然わかりません・・・・・・。 書店には、「やさしいJava」や「独習Java」や「Javaの絵本」系の本は沢山あるのに、「JSP/サーブレット」系の本は前者に比べると割合が少なく感じます。実際に仕事では「JSP/サーブレット」を使うのに何で少ないのか疑問ですし、「JSP/サーブレット」がわからなく、勉強したいのですがどの本が良いのかわかりません。 ページをめくってみて、どの本が良いのか見ているのですが、 それでも、わかりません。 皆さんどのように勉強されましたか? また、良い参考書などがあれば教えて頂きたいのですが、 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Beanについて

    こんにちは Beanについて素朴な疑問ですが Beanに値などをsetしたりgetしたりの操作は jspからしかできないのですか? サーブレットから操作はできないのですか?

  • javaサーブレットでjspへのフォワード処理と、ファイルに出力処理を行いたいのですが。。

    今javaサーブレットとjspでツール作成中です。 DBにアクセスして、その内容をCSVファイルに書き出すというツールなのですが、サーブレットではjspにフォワードという処理と、ファイルに出力という処理の二つを同時に行うことができるのでしょうか。 たくさんの本やサイトにそれぞれ片方の処理だけする場合は載っているのですが、両方を並行して処理させる場合のサーブレットの書き方がわかりません。。 jspからの情報をもとにサーブレットでDAOを生成、DBにアクセスし、検索結果をDTO(一行の情報はBean)に格納し、それをサーブレットからjspにフォワード&CSV出力というものを作りたいと思っています。 よろしくお願いします。

  • Javaのスレッドとcpuのスレッド

    javaのスレッドは各スレッドを少しずつ実行してあたかも同時に実行しているように見せかけているだけだと本で読んだことがあります。現在のcpuはi7 8700kだと6コア12スレッドになりますが、この場合どのような動きになるのでしょうか。 例えば12個のスレッドを使用したプログラムを実行するとpcが勝手に8700kの12スレッドに割り振って実行してくれるのか、それとも単にcpuの1スレッドでjavaの12スレッドを同時に動かしてるように見せかけるのか、cpuのスレッドとjavaのスレッドの関係がいまいち解りません。

  • Eclipseでプロジェクトを作るとコンテキスト記述子が出来ない?

    「はじめてのJSP&サーブレットプログラミング」という本で勉強しています。 その本では「データベースへの接続で、データソースを使ってデータベースに接続するようにするために、データソースの設定にコンテキスト記述子への記述が必要です。Tomcatの場合は~ディレクトリ以下にあります。」とあるのですが、Eclipseで「動的WEBプロジェクト」でプロジェクトを作ると、そこのフォルダにそのXMLファイルが出来ません。 ためしに「Tomcatプロジェクト」でプロジェクトを作ってみるとプロジェクトを作ったらすぐ出来ました。 これはEclipseでこういうサーブレットでデータベースに接続するような作業は「Tomcatプロジェクト」で作るように、ということなのでしょうか?しかし、「動的WEBプロジェクト」で作ったプロジェクトでは新規で何かファイルを作る時に候補に自動的にJSPやサーブレットといったものが挙がるのでやはりサーブレットは「動的WEBプロジェクト」で作るのでは? と分からないでいます。 よろしくお願いします。

    • ベストアンサー
    • Java
  • サーブレットで電卓をつくる

    サーブレットで電卓をつくりたいのですが、 参考になる本やサイトをぜひ教えてください。 よろしくお願いします。 ちなみに私はJAVA~JSPあたりを勉強しはじめて間もないプログラミング初心者ですm(_ _)m

    • ベストアンサー
    • Java

専門家に質問してみよう