Inilah kontribusi saya untuk pemahaman kolektif tentang perilaku ini ... Ini tidak banyak, hanya demonstrasi (berdasarkan demo xkip) yang menunjukkan perilaku ayat yang mudah menguap nilai int non-volatile (yaitu "normal"), berdampingan -di samping, dalam program yang sama ... yang saya cari ketika saya menemukan utas ini.
using System;
using System.Threading;
namespace VolatileTest
{
class VolatileTest
{
private volatile int _volatileInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _volatileInt = 1; }).Start();
while ( _volatileInt != 1 )
;
Console.WriteLine("_volatileInt="+_volatileInt);
}
}
class NormalTest
{
private int _normalInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _normalInt = 1; }).Start();
while ( _normalInt != 1 )
;
Console.WriteLine("_normalInt="+_normalInt);
}
}
class Program
{
static void Main() {
#if DEBUG
Console.WriteLine("You must run this program in Release mode to reproduce the problem!");
#endif
new VolatileTest().Run();
Console.WriteLine("This program will now hang!");
new NormalTest().Run();
}
}
}
Ada beberapa penjelasan singkat yang sangat bagus di atas, serta beberapa referensi yang bagus. Terima kasih untuk semua yang telah membantu saya memahami volatile
(setidaknya cukup untuk mengetahui tidak bergantung pada di volatile
mana insting pertama saya lock
).
Salam, dan Terima kasih untuk SEMUA ikannya. Keith.
PS: saya akan sangat tertarik demo dari permintaan yang asli, yang adalah: "Saya ingin melihat sebuah static int volatil berperilaku dengan benar di mana sebuah static int bertingkah.
Saya telah mencoba dan gagal dalam tantangan ini. (Sebenarnya saya menyerah cukup cepat ;-). Dalam segala hal yang saya coba dengan vars statis, mereka berperilaku "benar" terlepas dari apakah mereka mudah berubah atau tidak ... dan saya ingin penjelasan MENGAPA demikian, jika memang demikian ... Apakah itu kompilator tidak menyimpan nilai dari static vars dalam register ( sebagai gantinya ia menyimpan referensi ke alamat heap itu)?
Tidak, ini bukan pertanyaan baru ... ini adalah upaya untuk mengarahkan komunitas kembali ke pertanyaan awal.