1

共有オブジェクトがある場合、それは httpsession に保持されます。

同時変更なしで時々変更する場合 (たとえば、私の顧客情報はセッションで保持され、一度に 1 人の同じユーザー (この情報の所有者) のみがアクセスできます)、ある種の可能性はありますか?マルチスレッドなどに関連する問題?

フローの例: オブジェクトはセッション (スレッド 1) に保持されます。オブジェクトは、request1 を処理しているスレッドによって変更されます (ユーザーがデータを変更し、セッションに保存します)。オブジェクトは、request2 を処理しているスレッドによって変更されます (ユーザーは自分のユーザー情報を含むページを開きます)。

request2 によってレンダリングされたページ上のデータが古くなる可能性はありますか (ajax やその他の非同期処理は行われません)。

UPD: 私の問題は、httpsession(具体的なログインユーザーにバインドされている)に保持されている共有リソースへの順次アクセスのように感じることです。それが主な理由です。揮発性のものや同期を使用したくないのです。

4

2 に答える 2

6

確かに、複数のスレッドが同じデータにアクセスできる場合はいつでも、問題が発生する可能性があります。

ユーザーは複数のタブ/ウィンドウを開き、ほぼ同時にリクエストを行うことができます。これらのリクエストは、非決定論的な時間と順序で処理されます。

于 2012-08-15T15:48:23.827 に答える
4

あなたはあなたの質問に正確に答えるのに十分なスレッドの関連情報を与えていませんが、私はあなたにいくつかの一般的な警告を与えましょう。

  1. データの競合に起因する問題を経験するために、真に同時アクセスの必要はありません。数秒または数分離れた瞬間であっても、複数のスレッドからのアクセスで十分です。

  2. 発生する可能性のある問題は、あるスレッドから他のスレッドへの変更の可視性に起因します。読み取りと書き込みの間にhappens-before関係がない場合、JVMはローカルキャッシュ/スレッドローカルストレージからメインメモリに変更を伝播する必要はありません。その逆も同様です。読み取りスレッドは、メインメモリから新しいデータをプルする必要はありません。 。

  3. 使用している正確なコードによっては、ジャストインタイムコンパイラが読み取り操作全体を最適化して、最初に読み取り、その値を永久にキャッシュするだけで十分であることに気付く場合もあります(happens-beforeその読み取りとの関係がないため)。 。

happens-before要約すると、書き込みから読み取りまでの関係を確実にするための何らかの方法が間違いなく必要です。これは、コードの詳細によって異なります。

于 2012-08-15T16:00:12.957 に答える