View Full Version : تفاوت بین متغیر های static , وvolatile ( مهم)
tresa022
سه شنبه 15 مهر 1393, 11:15 صبح
دوستان طوری که من متو جه شدم تفاوتی که بین متغیر های volatile وstatic وجود داره اینه که اگه مثلا اگه قراره از یه متغیر چندین کپی باشه متغیر های استاتیک همه رو ی جور تعیریف میکنه و volatileبرای هر کدوم یک شاخص جدا در نظر میگیره
البته بیشتر تفاوت این دوتا تو تردها(نخ ها) مشخص میشه.
اگه دوستان اطلاعات کامل تری دارن بگن ممنون میشم .
مبحث خیلی مهمیه
Nevercom
سه شنبه 15 مهر 1393, 13:25 عصر
متغیرهای static و volatile ارتباط مستقیمی با هم ندارن.
درواقع متغیر استاتیک وابسته به کلاس هست و نه شئ، یعنی اگر متغیری رو استاتیک تعریف کنید، مهم نیست چندتا شئ از اون کلاس ایجاد شده (یاحتی بدون ساخته شدن شئ ی از کلاس میشه به متغیر استاتیک دسترسی داشت)، همه ی اونها به یک متغیر دسترسی دارن
در صورتی که برای متغیر های غیر استاتیک، هر شئ یک کپی از متغیر رو دریافت می کنه و ممکنه یک متغیر در شئ های مختلف مقادیر متفاوتی داشته باشه.
متغیر volatile در مبحث تردها معنا پیدا می کنه، درسته که ما میگیم متغیر استاتیک، در تمام اشیاء زیر مجموعه به یک کپی اصلی اشاره میکنه (و درواقع اگر شئ ۱ تغییری در مقدار متغیر استاتیک بده، اون تغییر در شئ ۲ هم نمایان خواهد بود)، اما در بحث تردها کمی فرق می کنه، ترد ها یک کپی محلی از متغیر ها (حتی استایک) برای خودشون ایجاد می کنن، که این باعث میشه تغییراتی که ترد ۱ در متغیر استاتیک یک کلاس میده، تضمینی وجود نداشته باشه که اون تغییر در ترد ۲ هم نمایان بشه.
اینجاست که متغیرهای volatile معنی پیدا می کنن، این کلمه ی کلیدی به JVM میگه که مقدارم رو کش نکن، یعنی ترد یک کپی محلی از تمام متغیرهای یک کلاس، بجز متغیرهای volatile برای خودش ایجاد می کنه.
یعنی یک متغیر volatile static در کلاسی که بین دو ترد مشترک هست، همیشه آخرین تغییرات رو به هر دو ترد اطلاع میده. یعنی هیچ کپی محلی از متغیر در ترد ها نیست (volatile) و مقدار متغیر بین تمام دسترسی های یک کلاس مشترک هست (static)
dasssnj
سه شنبه 15 مهر 1393, 14:20 عصر
صحبت هاتون کامل بود . ممنون.
میشه یه کد در مورد volatile بنویسید که نحوه ی کارو نشون بده؟ (یه مثال ساده)
tresa022
سه شنبه 15 مهر 1393, 20:20 عصر
در ادامه دوست عزیزمون که بابت توضیحات کاملشون تشکر میکنم
باید بگم که کابرد volatile خیلی زیاده مثلا من چن روز پیش یه پست گذاشتم که چطور تو لیست ویوم هر آیتم با ترد خودش پروگرس بارش حرکت کنه خب راهی نبود جز اینکه تو کلاسی که اطلاعاتم رو به arraylist میدم همون جا یک پروگرس بار volatile تعریف کنم و توابع setprogress و setmax رو مقدار دهی و مقدار گیری کنم تا بتونم وقتی از تردهامو صدا میزنم هر پروگرس بار برای هر ایتم خاص باشه
شرمنده میدونم بد توضیح دادم کدامو که کامل کرده میذارم خیلی بدرد بخوره volatile چون تو دسترسی ها برای اجزای لیست ویو کمک میکنه
Nevercom
سه شنبه 15 مهر 1393, 23:25 عصر
اینجا توضیحات بهتری داده همراه با مثال واقعی: http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.