• ベストアンサー

マルチスレッドの確認

いつも参考にさせて頂いています。 現在JavaにてWEBアプリを開発中です。 頻繁に多画面から同じオブジェクトへの参照が発生するため、インスタンス変数をsessionに格納し、syncronizedで同期化を図っていました。しかしシングルスレッド対応になってしまったため、レスポンスが悪化しました。そこでインスタンス変数をローカル変数にしてしまい、syncronizedをはずし、マルチスレッドで動くように対応してみたのですが、マルチスレッドで動いているかどうかっていうのはどう確認したらよいのでしょうか?うまく説明できなくて申し訳ありませんが宜しくお願いします。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • unibon
  • ベストアンサー率47% (160/340)
回答No.3

ANo.2 です。 > 時刻も表示ということですが、表示上どういう結果になればマルチスレッドの動作が確認できるでしょうか? 時刻は補助的なものです。なくても構いません。 System.out.println("入口 " + new java.util.Date()); などのようにして時刻も出力するようにしておけば、 入口 10:00:00 入口 10:00:02 出口 10:00:10 入口 10:00:11 出口 10:00:13 出口 10:00:18 みたいな感じ(表示はあくまでも例です)になって、少なくとも 10:00:02~10:00:10 の間は2つのスレッドが同時に動いていたんだな、ということが分かる、それだけのことです。 たとえですが、「メソッド」というひとつの箱があって、そこに複数のおはじき(やコイン等)を入れたり出したりして、その出し入れした際の時刻をノートに記入してみると、入れて、さらに、入れて、とやれば箱に2個入っているわけであり、2つのスレッドが同時に動いていることになります。(ひとつのおはじきがひとつのスレッドです。)

pgBeginImo
質問者

お礼

なるほど!やっと理解できました。 詳しく教えて頂いてありがとうございます! 早速試してみたいと思います。 また何か機会があれば宜しくお願いします!

その他の回答 (2)

  • unibon
  • ベストアンサー率47% (160/340)
回答No.2

> そこでインスタンス変数をローカル変数にしてしまい、syncronizedをはずし、マルチスレッドで動くように対応してみたのですが、マルチスレッドで動いているかどうかっていうのはどう確認したらよいのでしょうか? その synchronized を外したというメソッドの入口と出口に public void foo() { System.out.println("入口"); ... System.out.println("出口"); } のような println を仕込み、表示結果を見ます。 入口 出口 入口 出口 入口 出口 となっていれば、マルチスレッドになっていない可能性が高いです。 入口 入口 出口 入口 出口 出口 などのようになっていれば、マルチスレッドになっています。 (入ったのにまだ出ていない時点で、新たに入ってきたスレッドがあったから。) 文字だけではなく、時刻も表示させるようにしておけば完璧でしょう。

pgBeginImo
質問者

お礼

とても簡単な方法でとてもありがたいです。 時刻も表示ということですが、表示上どういう結果になればマルチスレッドの動作が確認できるでしょうか? どうか教授宜しくお願いします。

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

Thread.activeCount() メソッドの事ですか?

pgBeginImo
質問者

お礼

返事ありがとうございます。 activeCount()をどう使えばマルチスレッド動作を確認できるでしょうか? 検索して調べてみたのですがわかりませんでした…

関連するQ&A

  • デュアルコアCPUはマルチスレッドに最適?

    デュアルコアCPUはマルチスレッドに有効と聞きますが、マルチスレッドとはどういうものでしょうか? (1)単純に、3Dゲームをし、ネットをし、同時にエンコードをし、同時に画像処理し・・・っていう作業の「マルチ」ですか? (2)それとも、単独アプリケーション自体にマルチスレッド対応(?)のものがあるのですか? よく、3Dゲームはシングルスレッドのため、デュアルコアCPUの優位性を引き出せないといいますが、上記(1)の場合に当てはまりますか?

  • マルチスレッド下でのインスタンス変数・クラス変数

    よろしくお願いします。  マルチスレッド下で動作するクラスを作成しています。データにアクセスするためのオブジェクトを クラスのフィールド値として保持し、使い回しを行いたいと考えています。このデータアクセスオブジェクト(以下Dao)内では特にフィールドは使用せず、全てローカル変数のみで動作するようになっています。Dao自体は初回のクラス生成時にstatic処理にてフィールドにセットされます。  このDaoを保持するフィールドは、staticなクラス変数が良いのか、インスタンス変数として保持する方が良いのか迷っております。  クラス変数ならばPermanent領域をオブジェクト1つ分のメモリ使用で済み、インスタンス変数だとスレッド毎にheapを使い、処理数が増えるとメモリ圧迫しちゃう?と安易に考えてしまったりしています。  ご意見・ご助言よろしくお願い致します。

    • ベストアンサー
    • Java
  • マルチスレッドプログラミングの参考書

    スレッドやプロセスなどの意味は理解しているつもりです。 実際プログラミングをする技術を身につけたいと思っていますが おすすめの、勉強(参考)となる書籍はありますでしょうか? プラットフォームはLinux系です。 pthreadやselectを使用できればよいです。 最終的にどんなことがしたいかといいますと マルチスレッド対応したソケットプログラムを 作ってみたいのです。 シングルスレッドであれば、ある程度作れるのですが マルチスレッドではどのように作成していいのか・・・ 参考になりそうなHPでもいいのでよろしくお願いします。

  • 「UIスレッド」「マルチスレッド」の違い

    Androidで、「UIスレッド」「マルチスレッド」の違い、を教えてください。 ■下記理解で合ってるでしょうか? Androidは、「シングルスレッド」の「UIスレッド」モデルなので、それを「マルチスレッド」で動かそうとすると、「ワーカースレッド」で処理する必要がある ・「マルチスレッド」=「マルチタスク」? ・「UIスレッド」とは、メインスレッドが「GUI (グラフィカルユーザーインターフェイス) 処理」を行うものを指す? ・つまり、「Android」=「UIスレッド」? ・「UIスレッド」って何の用語? Androidに特化した用語? それともJAVAの用語? あるいはそれ以外?

    • ベストアンサー
    • Java
  • thisキーワードについて確認

    下記の確認事項が正しいかどうか、yesかNoかで判定してくださいましたら幸いです。 確認1:thisは、現在実行中のオブジェクト自身をあらわす参照型変数。 確認2:『インスタンスメソッドやコンストラクタから他のメソッドやメンバ変数を参照する場合、 オブジェクト変数を指定せず参照することができるが、それは、インスタンスメソッド、コンストラクタは現在のオブジェクトを表すthisを持っているため。単純名で参照されているインスタンスメンバは、 実はコンパイラによりthis.単純名に変換されている。 クラスメソッドは個々のオブジェクトに属さないため、メソッド内にthis を持っていないので、thisは使えない。』

    • ベストアンサー
    • Java
  • インスタンスとオブジェクト

    こんばんは。 変数について教えて下さい。 プログラム自体が初めてなので 「たのしい Ruby 第3版」を読んでいます。 ずっとインスタンスとオブジェクトの違いが曖昧なままです。 その本の「クラスとモジュール」という章にて クラスを定義する構文。 インスタンス変数とローカル変数の違いですが、 以下の説明で一部理解できずにつまずいています。 ―――――――――――― @ で始まる変数は インスタンス変数 といいます。 ローカル変数はメソッドごとに異なる変数として扱われますが、 インスタンス変数は同じインスタンス内であれば、 メソッド定義を超えてその値を参照したり、変更したりできます。 なお、初期化されていないインスタンス変数を参照すると nil が得られます。 インスタンス変数は、インスタンスごとに違う値を持つことができます。 またインスタンス変数は、 インスタンスがある間は値を保持しておいて 何度でも利用することができます。 一方、ローカル変数はメソッド呼び出しごとに新しく割り当てられるため、 メソッドから抜けると値を忘れてしまいます。 ―――――――――――― ここで分からないのは、 ・ローカル変数が "メソッドごと" に異なる変数として扱われる ・インスタンス変数は同じ "インスタンス内" であれば、 メソッド定義を超えてその値を参照したり、変更したりできます の部分です。 Webで検索してますが、 プログラミング経験ありを前提で書かれているような。 他の言語も知らないので分からない、そんなページが多いです。 人に聞くからには 自分でも頑張って理解できるように考えますので、 どうか回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • ローカル変数の使いかた

    非常に初歩的なのですがrubyにおいてインスタンス変数、ローカル変数とクラス変数の使い分けがわかりません。 あるクラス内においてクラスから作られたすべてのオブジェクトに適用したい値はクラス変数に、インスタンスごとに違うのならインスタンス変数にするのはわかるのですが、クラス内でローカル変数はなぜ使うのでしょうか?受け取った引数もオブジェクトならインスタンス変数に、クラスならクラス変数に原理的には属すと思うのです。 あるオブジェクトがあるメゾッドを実行した時にそのオブジェクト全体に適用したくない変数をローカル変数にすると考えました。 その場合、なぜ class A a= 1 end のようにメゾッドに属さないクラス内にあるローカル変数があるのでしょうか?

  • セッションオブジェクトの使い方(次画面の渡し方について)

    セッションオブジェクトの渡し方について教えてください。 セッションオブジェクトは、どのタイミングで、次の画面にセッションオブジェクトを渡しているのでしょうか? ▼リクエストオブジェクトを次の画面に渡す場合 request.setAttribute("キー" , 格納したい値); という風に、リクエストオブジェクトの中に値をセットできると思います。 そして、  ・RequestDispatcher rd = request.getRequestDispatcher("画面遷移先URL");  ・rd.foward(request, response); これが実行されたタイミングで、requestオブジェクトに格納した情報を、次の画面に渡していると思いますが ▼セッションオブジェクトを次の画面に渡す場合 いったいどこでセッションオブジェクトを、次の画面に渡しているのでしょうか? セッションの値の入れ方としては session.setAttribute("キー" , 格納したい値); という形でセッションオブジェクトに対して、値を格納しているのだとは思いますが・・・ ここでセットした値を、 どうやって、次の画面にもっていっているのでしょうか? 【不思議に感じているところ】  1.セッションオブジェクトを生成する  2.セッションオブジェクトの中に、値を格納する  3.rd.foward(request, response); で次の画面にリクエストを投げる  4.次の画面で「セッションオブジェクトは飛ばしていない筈なのに、セッションオブジェクトの中には値が格納されている」  うーん・・・  一体どこで、次の画面にセッションオブジェクトを渡しているのでしょうか?

    • ベストアンサー
    • Java
  • オブジェクトを格納するためのローカル変数のデータ型について

    ずっとCOBOLユーザで、初めてJAVAを勉強しています。 初歩的なところで、早くも躓いています・・・。 オブジェクトを格納する為のローカル変数の「データ型」について、 私が使用している本に「格納するオブジェクトのクラスがデータ型と なります。」と書かれていますが、ピンと来ません。 クラス名がデータ型になるって、どういうことなんでしょう? どなたか、こんな私に判るように説明していただけませんか? よろしくお願いします。

    • ベストアンサー
    • Java
  • PHPでセッションに入れたクラスの変数が消える

    こんにちは。 PHPでセッションを使っていて困ったことが怒りました。 セッションに入れたクラスインスタンスの中の変数が消えます。 一回目に参照したときは残っていますが、 2回目アクセスした時には無くなってます。 クラスインスタンスのメンバー変数に文字列など、PHP標準のものは残ってますが、メンバー変数にインスタンスを入れると、消えることが判明しました。 これはなぜですか?? よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう