Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

スレッドについて

スレッドがいまいち解らないのですが、例えばこの掲示板に1万人の人が同時にそれぞれの家からアクセスすると、このサーバーには1万個のスレッドが発生するのでしょうか?それともひとつのスレッドが順番にリクエストを受信して返信しているのでしょうか?

10

回答

4184

閲覧

10件の回答

評価

0

中にはそういうところもあるかもしれないが、普通はそのどちらでもない。

大抵はスレッドの最大数が決まってきて、その最大数に達するまでは同時に処理する、。
最大数に達した時点で、それ以外のリクエストには応答しないで待っててもらう。
先に処理されたリクエストがレスポンスを返し終えたら、待っててもらったものを処理し始める。

…Javaの質問じゃないなこれは。

評価

0

×決まってきて
○決まっていて

評価

0

スレッドというものをもう少し理解したほうが良い。
スレッドが1万個生成されようがそれがひとつのVM上で
動作しているならば1VMが処理しているのだ。
1万人が生成されるのではない。
VMが1万人が動作しているように見せかけているだけ。
実際には高速で動いているだけなので
たとえば1万個のスレッドを起動して
1スレッドに1秒を最低割り当てたとしたら
1万個目の実行は1万秒後になる。
この辺の機構はOSも同じ仕組みで動いている。
この仕組みを理解するにはスレッドとして考えるのではなくてタスク管理の分野になってくる。
ゆえに通常はスレッド数に上限を設けているのが普通である。
この辺を高速に処理する必要があるならスレッド間通信やVM間通信の知識が必須である。あとメモリーの意識も。通常はこんな場合はJavaより圧倒的にCの方が向いている。

評価

0

回答ありがとうございます。もうひとつ、市販のjsp・サーブレットの本にはサンプルで掲示板やショッピングサイトが載っていますが、そのコードにsynchronizedのようなスレッドセーフ関係のコードを見たことがありません。これは単に初心者には難しいだろう的な考えで載せていないだけなのでしょうか?webアプリケーションのスレッドセーフを勉強したいのですが、スレッドセーフを組み込んだサンプルが載っている本がなかなかありません。いい本があったら教えてほしいのですが。質問と言うより単なる頼みごとになってしまいすいません。

評価

0

>synchronizedのようなスレッドセーフ関係のコード

えーと、たとえばどんなところで同期が必要なんじゃないかと思っていますか?

>webアプリケーションのスレッドセーフ
といわれると、範囲が広すぎる気がするのですが…

評価

0

>たとえばどんなところで同期が必要なんじゃないかと思っていますか

よく参考本に掲載されているショッピングサイトで考えると、品物の在庫数とか、在庫を増減する部分とかでしょうか?しかし、その参考本ではsynchronizedは使用していないので、もしかしてどこかで自動で同期しているのか?とか思っていますが、そのなことありますか?

評価

0

>品物の在庫数

大体の場合在庫数を管理するのはデータベースなので、
非同期なDBというのはありえないと思います。
そのサンプルがデータの保存を何でしているのか判りませんが…。

>もしかしてどこかで自動で同期しているのか
それはそのものを見てみないとわからないのですが、
たとえばhibernateを使っている場合は、
トランザクション管理などをhibernateが提供してくれたりするので、その可能性は大いにあります。

評価

0

>非同期なDBというのはありえないと思います

データの保存先がDBなら同期コードは書かなくていいということでしょうか?DBを使用すればsynchronizedを使用する場面はない?しかしスレッドを勉強していると、スレッドセーフやsynchronizedは必ずでてくるので、やはり大事?しかしDBを使用すれば必要ない?DBを使用しないWEBアプリケーションでsynchronizedは使用するのだろうか?そもそもDBを使用しないWEBアプリケーションなんてあるのだろうか。頭が混乱してきました。

評価

0

DBはデータ格納の1形式で、ファイルだろうと同じこと。
格納先は、運用やIO性能等々によって決められ、アプリの実ロジックとは関係がない。
実処理のレイヤーと、入出力のレイヤーは切り離して考えるべきだ。

例えば物置に荷物を運び込む時、物置だけ見て「まだ入るな」と思って運んだら、他人(自分の前にスタートしたかもしれないし、途中で追い抜いたかもしれない)が先に置いて一杯にしちゃうこともある。
人が帰って来るまで別の人ががスタートできないようにするのが同期(synchronized)。

また、同期すればスレッドセーフにはなるが、スレッドセーフは同期の意味ではない。


ついでに、DBについてはレコードロックやテーブルロック等勉強するといい。
また、レプリケーションまで考えるとそうシンプルなものではない。

評価

0

>データの保存先がDBなら同期コードは書かなくていいということでしょうか

誤解です(・ェ・;)。
逆で、
>非同期なDBというのはありえない
ってのは、
「なにかしら」同期はしなきゃだめって意味。
ただ、同期の実現方法は、
synchronizedメソッドでやる
だけではないということ。

自分で実装(synchronized)するか、
登録処理自体をレコードロック等で制御するか、
hibernateなどの機能を使うかは、
そのとき次第。

基本的には、synchronizedを実装すると、
ロックが怖いしおもたーくなるので、
レコードロックを利用するのが普通かと。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。