インスタンス変数も静的変数と同じように共有されますか? これは、静的変数とインスタンス変数のみが原因で競合状態が発生することを意味しますか?
5 に答える
はい、インスタンス変数も共有されます。複数のスレッドがインスタンスにアクセスできる場合、オブジェクトの状態を破損する可能性のある古い読み取りまたはマルチパート書き込みから保護する必要がある場合があります。
さらに、ファイル システム上のファイルなどの外部リソースにアクセスすると、競合状態が発生する可能性があります。
インスタンス変数も静的変数と同じように共有されますか?
いいえ、それらはオブジェクトごとですが、静的はクラスごとです。スレッド オブジェクトのデータ メンバーに直接的な問題はありません。他のオブジェクトと同様に、各インスタンスは独自の変数を取得します。もちろん、スタックベースの自動変数も同様です。
スレッド オブジェクトのインスタンス変数と、スレッド オブジェクトによってスレッドごとに作成されたオブジェクトのインスタンス メンバーに関するマルチスレッドの問題に陥るには、もっと頑張らなければなりません。静的では、それは自然に起こります:)
これは、静的変数とインスタンス変数のみが原因で競合状態が発生することを意味しますか?
十分に努力すれば、ほとんど何でも台無しにすることができます。
Runnable/Thread オブジェクトのインスタンス変数はスレッド間で共有され (複数のスレッドが同じオブジェクトで動作している場合)、スレッド実行の順序またはシーケンスは保証されないため、一貫性のない結果が生じる可能性があります。
スレッド ローカル コンテキストを作成するための特定の構成要素がない場合、状態を保持するものは既定でスレッド セーフではありません。Runnable のインスタンスだけではなく、コードが触れてロックに失敗するものはすべて、未定義の動作の潜在的な原因となります (競合状態だけでなく、アプリケーションの状態を等しく危険にさらす他の予測不可能な部分更新の結果もあります)。