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

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

0

スレッドセーフについて

初めまして。初心者なのでわからないことばかりなので、皆さんに助
けていただければ、と思います。

現在、Java7、ストラッツ1.3という環境で
Web開発してます。

自分の担当画面は、あるテーブルに対して
登録、更新処理をする画面で、このテープルに
対しては、この画面からしか登録、更新はしません。
また関連するテーブルはなく、関連する画面は
この画面で登録した値を使ってファイルを出力する画面1つのみで
す。

この画面の利用者は2、3人になります。

設計書には記載がありませんでしたが客先から、テーブルへの排他は
特にせず問答無用で登録か更新してよいと言われそのように実装しま
した。

が、この画面の設計者である先輩から
それで競合おきないと保障できるの?スレッドセーフに
なってない!と怒られてしまいました。

そこで、不安になりスレッドセーフについていろいろ調べてみました
が、どんどんわからなくなってしまいました。

プログラムで実行中の変数値やインスタンスが
他のスレッドと混合(競合?)してしまうようなことがあるのでしょう
か?

DBの排他以外に何に気をつけ、どのように実装すればよいのかよくわ
かりません。


各画面クラスのインスタンスがスレッド毎に生成され
実行されるので問題ないと思っているのですが、
この考えに間違いがありますか?
私の担当画面で競合が起きる場合はあるのでしょうか?

他の画面と共通で使っているクラスが静的クラスだったりすると
問題なんでしょうか?インスタンスを作ってやれば問題ないでしょう
か?

先輩は怒っていて口を聞いてくれないので
とても困っています。

どなたかご教授いただけるととても助かります。
どうかよろしくお願いいたします。






7

回答

85939

閲覧

7件の回答

評価

0

状況説明だけでは、誰も分からんよ。実際のモノが見られな
ければ。

怒っていて教えてくれないなんてのは、仕事で許されるもの
ではない。
それはここで書くべきこではなく上司に相談すべきことだ。

例えばServletのinstanceは通常一つしか作られない。
doGet(でもPostでも)で処理をしている間、フィールドに値
を保持すればスレッドアンセーフだ。
スレッドアンセーフなクラスをstaticフィールドに置いて使え
ば、それもスレッドアンセーフだ(ありがちなのは
SimpleDateFormat)。

また、リクエストごとにあるクラスのinstanceを生成している
ように見えても、そのクラスが内部的に何かをinstance間で共
有していれば、それもスレッドアンセーフになる。

DBの排他にばかり気を取られてもだめだ。

評価

0

質問者です
ストラッツの標準実装方法とおりにしています。
アクションクラスには、余計な変数等をもたない
よう実装していますが、それでもスレッドセーフに
ならないのでしょうか?

ストラッツにお詳しい方がいれば
教えていただけたらと思います。

ストラッツの標準実装がスレッドセーフに
ならないのかどうか、または例外として気をつけるべき点に
教えていただけると幸いです。

評価

0

StrutsのActionがリクエストごとに作られるかは設定による。
デフォルトでは、Struts1はリクエストごと、Struts2はシング
ルトンだったと思うが。
先に書いたように、そのクラスのフィールドを見ただけでス
レッドセーフだとは言えない。

ただ、最初の書き込みからするとえらく単純な話か、または
そいつの勘違いかに思えるが。

で、上司に相談はしてみたのか。
職場の人間なら作業を手伝うのは仕事のうちだが、ネットの
掲示板にいる人間はその限りではないということも、考えて
みるといい。
何しろ、自分はそれで給料を貰うのだから。
対価を払って手伝いを募るならともかく。

評価

0

クラスにスレッドセーフでないフィールドを
定義し更新すると壊れたりするのでフィールドに気をつければ間違いないと思うけど。

実際にあったのは
HashMapやSimpleDateFormatをフィールドに定義し複数のスレッドから呼ばれていたとか。
数百人で仕様するシステムで結構呼ばれるメソッドでしたが、それでも数年間一度も問題は起きずに後で気づいて直したことはあったね。

>先輩は怒っていて口を聞いてくれないので
私の勝手な予想では具体的にどこが悪いのか
ソースコードをみてもすぐに判断できないから
無視してるだけと思われ(笑)
がんばってください

評価

0

質問者です。
みなさんありがとうございます。

みなさんに教えていただいた内容を元に
もう少し自分でも勉強し、明日ソースをもう一度みてみます。

先輩の件ですが、上司でもあり、支店の最高責任者であり
かつ、私が転職したばかりのため、相談出来る人がいません。

ただ、今までの対応から、自分のミスを指摘されたり
お客さんから私に直接依頼がくるようなことが
あると、難癖?をつけてくるような人なので
今回も同様かなと思いましたが、私がストラッツや
スレッドセーフの知識不足のため、不安だらけです。

今までも何回も同じようなことがあり、じゃあ具体的に
教えて下さい、というと捨てセリフを吐き、以降
しばらく口を聞いてくれなくなるという繰り返しです。

Yes、Noで答えを求めても、そもそも〜から始まり
なぜか怒鳴られる日々で。
すみません、質問から外れてしまいました。

ただ、本日もずっと調べていましたが絶対的にストラッツ&スレッド
セーフの知識がまだまだ
私には足りないので、もう少し勉強します。
もし、皆さんの知識等お借りいただけるなら
まだまだいろいろとご教授いただけると幸いです。

評価

0

ダメ上司だと、言うのは簡単なことだが(実際そのように読
めるが)、書かれたことはあくまで質問者の視点だ。
上司の態度の問題はそれとして、自分の今までの受け答えに
何か問題があったかも、合わせて考えた方がいいな。

例えば「これじゃだめだ」と言われたとき、「何が悪いの
か、どうすればいいのか」と単純に聞き返すだけなら、よほ
どの聖人でない限りは何回めかでうんざりする。
自分の考えはこうで、だからこれで問題ないと考えている、
などと、きちんと説明したことがあるのか。

評価

0

上司問題についつですが、ありがとうございます。

もちろん、具体的に何がこうだから
問題ない、等いつも説明してるんですが
こちらが正しいと、捨てセリフをはいて
無視されるの繰り返しで…

そもそも、あまり技術があると思えないので
わざわざ質問もしません。
ただ、客先と私の会話を聞いて
あとから口出しして難癖?をつけてくる、
の繰り返しです。
レビュー時に皆さんに話して欲しい、と言っても
絶対に二人の時にしか言いません。

ただ今回の件については完全に私の知識不足のため
不安ばかりが募った次第です。

客先では、私の方が立場が上なので
私に対してよくは思ってないと思います。
契約も上司だけ切られる事が決定しているので
面白くないと思います。

元はと言えば、この上司のリカバリ不可能な進捗遅れのため
別件対応していた私にこの仕事が回ってきた次第であります。

すみません、完全に愚直でした。
ただ、こんな上司が支店最高責任者のような
会社を選んだ私はバカなんだな、と思いました。



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