11

I found that declaring a variable as static makes no senseマルチスレッドで。のせいだと思いevery thread has its own stackます。これが唯一の理由ですか?

私はそれを知っていstatic variables should be used within synchronized blockます。しかし、なぜ?

4

4 に答える 4

33

static はマルチスレッドでは意味がありません。

申し訳ありませんが、あなたは逆の発言をしています。静的変数は共有リソースであり、異なるスレッド間で情報を交換するために使用できます。そして、そのような共有リソースにアクセスする際には注意が必要です。したがって、マルチスレッド環境での静的変数へのアクセスが同期されていることを確認する必要があります。

すべてのスレッドには独自のスタックがあります

これは正しいステートメントです。Each thread has its own stack but they share the process heap.スタックはローカル変数のみを保持し、ヒープ上の変数は保持しません。静的変数はPermGenヒープのセクションに格納されるため、それらへのアクセスは十分に保護する必要があります。

于 2013-07-06T06:16:57.100 に答える
6

質問の最初の部分はすでに回答されているので、2番目の質問に答えようとします。

同期ブロック内で静的変数を使用する必要があることを知っています。しかし、なぜ?

atomicを使用しない場合、変数を使用した操作はアトミックではないためです。そのため、変数を操作している間は変数をブロックする必要があります。しかし、実際には、volatileキーワードを使用できます。これにより、スレッドが変数の実際の値を持つことが保証されます。

于 2013-07-06T06:42:33.747 に答える
3

マルチスレッド環境で変数を変更した場合、新しい値はキャッシュされる可能性があるため、必ずしも表示されない場合があります。もちろん、これは静的変数にも当てはまります。同期ブロックを使用しない場合は、volatile代わりに使用することを検討してください。これにより、同期を必要とせずに、さまざまなスレッドが更新されたコピーを取得することも保証されます。volatileアプリケーションは要件に応じて 4 つあれば十分です。

于 2013-07-06T06:54:26.063 に答える
2

volatile静的宣言に追加します。

volatile他のスレッドが変数の最新の値を見ることを保証します。したがって、 volatile を使用すると理にかなっています。

ただし、volatileアトミック性は保証されません。複数のスレッドから変数に書き込む場合は、アトミックまたはsynchronizeブロックを使用することをお勧めします。

大丈夫だと思いますvolatile

于 2013-07-06T06:59:49.023 に答える