1

たとえば、次のような 2 つのプログラムがあり ます。
共有変数:

boolean f0 = false;
boolean f1 = false;

プログラム 0:

1. f0 = true;
2. while(f1==true){}
3. //Important section
4. f0 = false;

プログラム 1:

a. f1 = true;
b. while(f0==true){}
c. //Important section
d. f1 = false;

私が聞きたいのは、両方のプロセスが同時に重要なセクションに入る可能性があるということですか? 特定のコード実行の例を教えてください。
どうもありがとうございました。

4

5 に答える 5

2

一言で言えば、はい、無数の理由 (キャッシュ、命令の並べ替えなど) があります。

于 2012-11-26T22:39:21.290 に答える
1

プロセス0のみがf0に書き込みますが、プロセス0がf0に書き込んでいる間に、プロセス1がf0を読み取っている可能性があるため、クリティカルセクションで両方のプロセスを確実に取得できます。

synronized複数のスレッドを安全に処理する方法を学ぶには、キーワードを検索する必要があります。

于 2012-11-26T22:42:32.273 に答える
0

これらが本当に別々のプロセスである場合、それらの操作は互いに完全に独立しているため、答えは「はい」です。それぞれに、すべての変数の独自のコピーがあります。

おそらくスレッドについて質問するつもりでしたか?とにかく、同期メカニズムを導入しない限り、答えは同じです。

于 2012-11-26T22:41:00.740 に答える
0

はい、これは起こり得ます!

そのセクションを保護することができます

// this Object must be shared between both Threads.
Object lock = new Object();

synronized(lock) {

//  .. here protected

}
于 2012-11-26T22:40:01.497 に答える
0

このコードが順次一貫した方法で実行された場合、答えはノーです。これら 2 つのスレッドが同時にクリティカル セクションに入るような実行順序はありません。

Javaレルムを考えれば、可能です。一部のデータを共有しているにもかかわらず、スレッドは同期を使用しません。この場合、JVM は、互いの書き込みを監視することを保証できません。

しかし、いずれにせよ、この「ミューテックス」はデッドロックを起こしやすいです。この実行を検討してください:

f0 = true;
f1 = true;
---------------------
while (f0) {}
while (f1) {}
于 2012-11-30T19:59:04.240 に答える