java - i++ についての質問
phpcn_u1582
phpcn_u1582 2017-05-17 10:00:27
0
2
593

i=1 (i) をインクリメントするには 2 つのスレッドを使用し、各スレッドはそれを 100 回実行します。可能な最大値と最小値は何ですか?説明してください

また、私はアトミックですか?

phpcn_u1582
phpcn_u1582

全員に返信(2)
洪涛

最小値は 3 (+2)、最大値は 201 (+200) です。 。 。 。なぜ0から始めないのか。 。 。

サイクルプロセスは次のとおりです:

  1. メモリからレジスタにデータを読み取ります

  2. レジスタ値++

  3. データをメモリに書き戻す

スレッドは、これら 3 つのステップのいずれかで中断される可能性があります。 3 の場合は次のとおりです。
最初のスレッドはデータ 1 を読み取り、その後一時停止され、レジスタ値が別の場所に保存されます。 1,然后被挂起,寄存器的值被保存到另一个地方。
第二个线程,持续执行了 99 次(此时,内存中的值为 100),然后被挂起。
第一个线程被唤醒,恢复寄存器的 1 +1 之后 (=2)被写回内存,该线程被挂起
第二个线程从内存读取2到寄存器之后被挂起
第一个全部执行完,把值写回内存
唤起第二个线程,恢复寄存器中的2 2 番目のスレッドは 99 回実行され続け (このとき、メモリ内の値は 100 でした)、その後中断されました。

最初のスレッドが起動され、リカバリ レジスタ (=2) の 1 +1 がメモリに書き戻された後、 スレッドは一時停止されます >3最初の 2 つのスレッドは 2 をメモリからレジスタに読み取り、一時停止されます。最初のスレッドは完全に実行され、値をメモリに書き込みます。

2 番目のスレッドを呼び出します。 2 の値をレジスタに復元し、最後のループの完了後に 3 を書き戻します +1

最終結果は

です。 。 。 。

🎜もっと小さなスケジュール方法はまだ考えていません。 。 。 🎜 🎜最大値については、あまり説明する必要はありません。 。 。 。 🎜
いいねを押す +0
Ty80

最小値は 2、最大値は 200 です。
2 は、両方のスレッドが CPU キャッシュ内のデータを変更し、最終的にメモリが 1 回だけリフレッシュされることを意味します。
200 は、2 つのスレッドが互いに競合することなく交互に読み取りと変更を行うことを意味します。
私たちは皆、最大値と最小値について尋ねましたが、当然のことながら、それらは原子的ではありません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート