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
ます。しかし、なぜ?
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
ます。しかし、なぜ?
static はマルチスレッドでは意味がありません。
申し訳ありませんが、あなたは逆の発言をしています。静的変数は共有リソースであり、異なるスレッド間で情報を交換するために使用できます。そして、そのような共有リソースにアクセスする際には注意が必要です。したがって、マルチスレッド環境での静的変数へのアクセスが同期されていることを確認する必要があります。
すべてのスレッドには独自のスタックがあります
これは正しいステートメントです。Each thread has its own stack but they share the process heap.
スタックはローカル変数のみを保持し、ヒープ上の変数は保持しません。静的変数はPermGen
ヒープのセクションに格納されるため、それらへのアクセスは十分に保護する必要があります。
質問の最初の部分はすでに回答されているので、2番目の質問に答えようとします。
同期ブロック内で静的変数を使用する必要があることを知っています。しかし、なぜ?
atomicを使用しない場合、変数を使用した操作はアトミックではないためです。そのため、変数を操作している間は変数をブロックする必要があります。しかし、実際には、volatileキーワードを使用できます。これにより、スレッドが変数の実際の値を持つことが保証されます。
マルチスレッド環境で変数を変更した場合、新しい値はキャッシュされる可能性があるため、必ずしも表示されない場合があります。もちろん、これは静的変数にも当てはまります。同期ブロックを使用しない場合は、volatile
代わりに使用することを検討してください。これにより、同期を必要とせずに、さまざまなスレッドが更新されたコピーを取得することも保証されます。volatile
アプリケーションは要件に応じて 4 つあれば十分です。
volatile
静的宣言に追加します。
volatile
他のスレッドが変数の最新の値を見ることを保証します。したがって、 volatile を使用すると理にかなっています。
ただし、volatile
アトミック性は保証されません。複数のスレッドから変数に書き込む場合は、アトミックまたはsynchronize
ブロックを使用することをお勧めします。
大丈夫だと思いますvolatile
。