آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

(کلمات کلیدی جاوا) واژه volatile

***ali***  10 سال پیش  10 سال پیش
+4 0

سلام دوستان در مورد واژه ی  volatile

در جاوا و کاربردش  توضیح بدهید.

 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
محمد حسین زاده  10 سال پیش
+11 0

برای تعریف متغیر تو جاوا استفاده میشه و باعث میشه که ترد های مختلف بتونن مقدار اون متغیر رو مدیریت کنن - وابسته به ترد خاصی نمیشه و مقدارش تو Main memory ذخیره میشه

دسترسی به این متغیر هم در حیطه یک synchronized block اتفاق میافته

کارایی هایی هم که داره معروفترینش ساخت متغیر یکتای تنبله (ترجمش ناجوره!) Lazy Singleton

public class Singleton{
private static volatile Singleton _instance;

public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}

برای اعمال ساده read-write هم مناسبه نه برای مواقعی که read-update-write با شبهه همزمانی مطرح باشه چون عملا موقع مقدار دهی lock اتفاق نمیافته

اما درک کاملش نیاز به تحقیق و تمرین داره

پاسخ به سوال 
MEHDI007  10 سال پیش
+2 0

با سلام!

به کار گیری این کلمه ی کلیدی به هنگام تعریف یک متغیر در برنامه نویسی به این معناست که مقدار این متغیر می تونه توسط Thread های مختلف تغییر کنه.
وقتی ما از volatile در یه متغیر استفاده نکنیم و مقدار این متغیر توسط یه پردازش خارجی (مثل یه ریسمان مجزا) تغییر کنه کامپایلر متوجه اون نمیشه. چون به دلیل عمل Optimizing مقدار متغیر چک نمیشه. ولی وقتی از volatile استفاده کنیم عمل Optimizing روی متغیر صورت نمی گیره و مقدا راون مستقیما" از توی حافظه ی اصلی خونده میشه.


عمل Optimizing

کد ی زیر رو در نظر بگیرید.

 static int foo;
 
void bar (void)
{
    foo = 0;
    while (foo != 255)
    {
        //...
    }
}

حلقه ی while تا زمانی ادامه پیدا می کنه که مقدار foo برابر 255 بشه. از طرفی در خط قبل ما مقدار foo رو 0 کردیم و در این برنامه این مقدار هیچ وقت از صفر به مقدار دیگه ای تغییر داده نشده. درنتیجه مقدار foo هیچ وقت برابر 255 نمیشه و پیرو اون حلقه ی while هیچ زمان خاتمه پیدا نمی کنه. پس اصلا" نیازی نیست که همیشه مقدار foo بررسی بشه و حلقه بعدش تکرار بشه.

وقتی از کلمه ی volatile در تعریف متغیر foo استفاده نکنیم، کامپایلر برنامه ی ما رو به این شکل Optimize می کنه:

 static int foo;
 
void bar (void)
{
    foo = 0;
    while (true)
    {
        //...
    }
}

می بینیم چون نیازی به چک کردن foo نبود و حلقه ی while بی پایان است، کامپایلر foo رو در شرط حلقه با مقدار true جایگزین کرده که این عمل از فرآیند های Optimize محسوب میشه.

حالا فرض کنیم که مقدار foo نه توسط این برنامه بلکه توسط یه برنامه یا ریسمان دیگه تغییر داده بشه. اگه اون برنامه یا ریسمان مقدار foo رو برابر 255 کنه، حلقه باید طبق منطق کد اول تموم بشه ولی در کد Optimize شده چون مقدار foo بررسی نمیشه، حلقه همچنان تکرار میشه. برای اینکه در مرحله ی Optimize چنین مشکلات رخ نده، متغیر هایی رو که امکان تغییرشون توسط جریان های دیگه هست رو همراه با volatile تعریف می کنن که در اون صورت برنامه همواره مقدار متغیر رو از حافظه ی اصلی فرخوانی می کنه و اون متغیر ها مشمول Optimize نشن.

تمام شد با تشکر!

0 0
البته بنده باید از شما تشکر کنم (10 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .