در این جلسه تیم کدگیت را با آموزش Volatile در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر است:

  1. Thread در جاوا
  2. Synchoronized در جاوا
  3. بن بست در جاوا
  4. مانیتور در جاوا

Volatile در جاوا

به جرات می‌توان گفت کلمه کلیدی Volatile در جاوا به درستی آموزش داده نمی‌شود و معمولا برنامه‌نویسان با آن آشنا نیستند. به طور کلی متغیری که به صورت Volatile تعریف شود بدین صورت ترجمه می‌شود ” ذخیره شدن در حافظه اصلی”. هر متغیری که به صورت Volatile تعریف شود از حافظه اصلی کامپیوتر خوانده می‌شود و از Cache خوانده نمی‌شود. تا زمانی که از Volatile استفاده نشود هیچ تضمینی وجود ندارد که متغیرها از حافظه اصلی خوانده شوند.

Volatile چه چیزی را تضمین می‌کند؟

کلمه کلیدی Volatile تضمین می‌کند که تغییرات اعمال شده بین Thread ها توسط یکدیگر دیده شود. ممکن است سوال پیش بیاید که چرا ممکن است تغییرات دیده نشود؟! برای پاسخ به این سوال، ابتدا تصویر زیر را توضیح می‌دهیم.

Volatile در جاوا

وقتی یک برنامه از Thread استفاده کند، هر Thread ممکن است یک کپی از متغیرها را درون کش CPU ذخیره کند و دلیل آن هم افزایش کارایی برنامه است. اگر کامپیوتر شما بیشتر از یک CPU داشته باشد هر Thread در CPU جداگانه‌ای اجرا خواهد شد. هر CPU نیز متغیرهای مورد استفاده برنامه را کش می‌کند. با این تفاسیر آیا ممکن است هر CPU مقدار متفاوتی در خودش ذخیره کند؟! جواب این سوال را در قسمت بعد توضیح می‌دهیم.

مثال Volatile

همانطور که گفته شد در صورت استفاده نکردن از Volatile هیچ تضمینی وجود ندارد که JVM متغیرها را از حافظه اصلی بخواند. تضمین نشدن همین موضوع مشکلاتی را برای برنامه ایجاد می‌کند. در این قسمت این مشکل را توضیح می‌دهیم.

Volatile در جاوا

فرض کنید دو یا چند Thread همزمان به متغیری به نام Counter در کلاس ShareObject دسترسی دارند. همچنین فرض کنید Thread اول برای افزایش متغیر Counter و Thread دوم برای خواندن این متغیر می‌باشد. همانطور که در تصویر بالا مشاهده می‌کنید مشکلی که ممکن است ایجاد شود مقداری که در کش CPU تغییر می‌کند ممکن است در حافظه اصلی بازگردانده نشود. اما اگر از Valotile استفاده شود مطمئن می‌شویم که متغیر در حافظه اصلی تغییر خواهد کرد. نحوه استفاده از Volatile به صورت زیر است:

volatile int counter = 0;