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

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

0

スレッドセーフについて

Javaを現在勉強中ですがスレッドセーフについて混乱しています。

Servletのインスタンス変数が複数のスレッドから参照可能なので注意が必要という事は理解できるのですが、ネットを見ているとインスタンス変数はすべて注意が必要とされているように思います。

newして新たに生成したクラスのインスタンスの変数についても別のスレッドから参照、または、更新が可能という事なのでしょうか?

また、Beanなどでsetterを使用してprivateなインスタンス変数に値をセットする場合も別のスレッドで同じようにセットしていたら別スレッドの値が更新されてしまうのでしょうか?

こう考えると、値セットや更新系のすべてのメソッドにsynchronizedをかけないとスレッドセーフにならないように思いますが、JSP、ServletのWebアプリ用の書籍などを見ると、synchronizedをかけているものは見当たりません。

6

回答

6118

閲覧

6件の回答

評価

0

>別のスレッドから参照、または、更新が可能
なんらかの方法で複数のスレッドから特定可能であれば。

>newして新たに生成したクラスのインスタンスの変数
個々のインスタンス内で同じインスタンスを参照し、適切に排他していなければ。

逆に言うと、全て別のインスタンスであるか、うまく排他されているなら問題にならない。

>値セットや更新系のすべてのメソッドにsynchronizedをかけないとスレッドセーフにならない
jsp, servletに関して言えば、適切な排他がなければフィールドの値は混じる。
「リクエストの値をフィールドにセット→Thread.sleep()→フィールドの値を表示」を2回呼べば検証できる。

が、そもそも普通servlet/jspでインスタンスフィールドは使わない。newしてrequestスコープに入れるはず。
というわけで、

>書籍などを見ると
書籍にフィールドを使ったservletのコードが載ってるとは思えない。

評価

0

>ネットを見ているとインスタンス変数はすべて注意が必要

クラス変数の間違い…じゃない?
あんまりインスタンス変数すべて注意しろと書いてあるサイト様に当たったことがないのですが…?

評価

0

>個々のインスタンス内で同じインスタンスを参照し、適切に排他していなければ。
もちろん、その共通インスタンスが全く更新されないのであれば、普通排他自体必要ではないが。

評価

0

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

混乱元のサイト
http://www.atmarkit.co.jp/fjava/rensai2/webopt04/webopt04.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20070820/279950/

Servlet(HttpServletを継承したクラス)とJSPのインスタンス変数がヒープ領域に格納される為、ServletとJSPのインスタンス変数は注意が必要という意味だったようです。Servletというのがもっと大きい括り(実装したすべてのクラス)だと勘違いしていました。

お騒がせしました。

評価

0

どの言語も、はじめは混乱しますよね。。。
初心者によってはどれも似たような言葉に見えてしまう。。。
言語設計者も、もっとフレンドリーに作れないもんですかね。。。?という私も超初心者でした。。。

評価

0

たしか、京大アメフト部監督の言葉だったと思う。

努力しないで一流になれる世界は、
その世界自体が三流なのだ。

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