- PR -

先にアクセスした人の情報が書き換えられる現象について

1
投稿者投稿内容
タカシ
会議室デビュー日: 2002/11/12
投稿数: 14
投稿日時: 2003-12-12 14:08
WEB画面にアクセスして自分の情報を表示・更新しようとすると,
画面に他人の情報が表示されるという現象が起こります。
色々と調査したのですが以下の内容は判明しました。

>変数を宣言する際にstaticというキーワードを宣言するだけで,
>変数は共有されてしまう。
>他のユーザーの処理が変数を書き換えてしまうために,
>誤ったデータが表示されるだけでなく,誤ったデータによる
>更新が行われる場合もある。

現状ですが、プログラム上では変数(strTest)に表示するデータをセットして
System.out.println(strTest)
で表示させています。変数も static を使用せず、処理の最初に
strTest = ""
で初期化しています。
上記のプログラムで2人がほぼ同時にアクセスすると、
タイミングで少しだけ後にアクセスした人は自分の情報が表示されていますが、
先にアクセスした人は後にアクセスした人と同じ情報が表示されてしまいます。
ログをとって strTest の値を調べてみましたが、先からアクセスした人の strTest は
後にアクセスした人と同じ情報に書き換わっていました。
おそらく処理の流れとしては以下の通りだと思われます。

(1)一人目がページにログイン
(2)一人目が strTest を初期化
(3)一人目が strTest に情報をセット
(4)二人目がページにログイン
(5)二人目が strTest を初期化
(6)二人目が strTest に情報をセット
(7)一人目が strTest を画面に表示する
(8)二人目が strTest を画面に表示する

上記6で変数の値が上書きされている為に上記7での表示時に後の人の情報が
表示されていると考えています。

どなたか同じような現象を解決された方がおられましたら、
教えて頂けないでしょうか。

宜しくお願い致します。
でくのぼう
大ベテラン
会議室デビュー日: 2003/10/06
投稿数: 162
投稿日時: 2003-12-12 14:22
strTest を保持しているインスタンスがスレッドセーフに
扱われていないだけではないでしょうか?
米山@クロノス
大ベテラン
会議室デビュー日: 2003/06/10
投稿数: 103
お住まい・勤務地: 大阪市淀川区西中島4-13-22 新大阪淀川ビル5F
投稿日時: 2003-12-12 14:26
こんにちは。米山@クロノスです。
サーブレット(明記されていませんが、おそらくサーブレット?)はマルチスレッドで動作するということは基本中の基本なので、そのあたりをもう一度学習してみてはどうでしょうか。
一口に変数と言っても、クラス変数、インスタンス変数、ローカル変数があります。それら変数のスコープも関係してきます。

[ メッセージ編集済み 編集者: 米山@クロノス 編集日時 2003-12-12 14:29 ]
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2003-12-12 14:28
http://muimi.com/c/scwcd/sec07.html

等見られるといいかも知れません。
strTestがサーブレットのインスタンス変数だというオチだと思います。

頑張ってもうちょっとご自分で調べてみられることをお勧めします。
#多分、よく知られている問題ですので
begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-12-12 17:23
以前に経験したことあり・・・(^^;
これはサーブレットですか?

doGetとdoPostの中で、ローカル変数で処理しないとNGかもしれません。
以前にローカルで変数を唱えなかったときに同じような現象が出ていました。確かローカルに持ってくることで、回避した記憶があります。

ちがっていたら、すいません。
1

スキルアップ/キャリアアップ(JOB@IT)