کلمه کلیدی volatile نشان می دهد که یک فیلد ممکن است توسط چندین thread همزمان اجرا می شوند تغییر کند. هدف اصلی از کلمه کلیدی Volatile جلوگیری از بهینه سازی کامپایلر به شرطی که تنها دسترسی یک Thread را فرض می کند.
استفاده از volatile این اطمینان را می دهد مقدار یک فیلد، جدیدترین مقداری است که در دسترس است و این مقدار منوط به caching نیست که مقادیر غیر فرار(non-volatile) هستند.
روش خوبی است که هر متغیری را که توسط چندین thread استفاده شود به عنوان متغیر ناپایدار علامت گذاری کنید تا از رفتارهای غیر منتظره به دلیل بهینه سازی های پشت صحنه جلوگیری کند.
public class Example { public int x; public void DoStuff() { X=5; var y=x+10; Debug.WriteLine(“x=” x+” , y= “+y); } }
در تکه کد بالا کامپایلر x=5 , y=x+10 را می خواند و تعیین میکند که این مقدار y همیشه 15 می ماند. بنابراین در آخرین بهینه سازی کامپایلر y=15 می باشد. اگر چه متغیر x در حقیقت از نوع عمومی می باشد و مقدار x ممکن است توسط Threadهای دیگر در زمان اجرا تغییر کند.دیگر مقدار y=15 نمی باشد. حال متغیر x را از نوع volatile تعریف می کنیم:
Public class Example { Public volatile int x; Public void DoStuff() { x=5; var y=x+10; Debug.writeline(“x=” x+” , y= “+y); } }
حال کامپایلر عملیات قفل را برای فیلد x ایجاد می کند و این اطمنیان را می دهد که مقدار کنونی x همیشه این مقدار را برگرداند. اگر چندین Thread بر روی این فیلد بخوانند و بنویسند این اطمینان را می دهد که این مقدار کنونی همیشه برمیگرداند. volatile میتواند فقط بر روی فیلدهای کلاس و ساختار عمال شود و برای مثال زیر معتبر نمی باشد
Public void MyMethod(){ volatile int x; }
فقط می توان بر روی فیلد های زیر اعمال کرد:
1- رفرنس تایپ و نوع های عمومی که رفرنس تایپ معرفی شده باشد
3. نوع های شمارشی که بر اساس sbyte, byte,short,int,ushort ,uint char, float, bool
3. نوع های شمارشی که بر اساس sbyte, byte, short, int, ushort, uint
نکات: