tgoop.com/javapro_ir/4527
Last Update:
🧠 مدل حافظه در جاوا (Java Memory Model) و نقش volatile
مدل حافظه در جاوا یا JMM مشخص میکند که چگونه Threadها به حافظه دسترسی دارند و چه زمانی تغییرات در متغیرها توسط سایر Threadها دیده میشود.
این موضوع اهمیت زیادی در برنامههای همزمان (Concurrent) دارد، چون بدون آن نتایج غیرقابل پیشبینی رخ خواهد داد.
📌 مسئلهی اصلی: Visibility و Reordering
برنامههای چندنخی در جاوا روی پردازندهها اجرا میشوند و پردازندهها برای افزایش سرعت، دستورها را ممکن است بازچینی (Reorder) کنند. همچنین هر Thread معمولاً دادهها را در Cache محلی خودش نگه میدارد.
به همین دلیل دو مشکل اصلی ایجاد میشود:
Visibility (قابلیت مشاهده):
یک Thread مقدار جدید متغیر را تغییر میدهد اما سایر Threadها همچنان مقدار قدیمی را میبینند.
Reordering (بازچینی):
دستورها توسط CPU یا کامپایلر جابهجا میشوند و در نتیجه Thread دیگر ترتیب مورد انتظار را نمیبیند.
✅ نقش volatile
کلمهی کلیدی volatile به جاوا میگوید که:
1. همیشه مقدار متغیر از حافظه اصلی (Main Memory) خوانده شود.
2. هر تغییر در متغیر بلافاصله برای سایر Threadها قابل مشاهده باشد.
3. بازچینی دستورها (Reordering) برای دسترسی به این متغیر ممنوع شود.
🔎 مثال بدون volatile (رفتار اشتباه)
public class WithoutVolatile {
private static boolean running = true;
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
while (running) {
// مشغول کار
}
System.out.println("Worker stopped!");
});
worker.start();
Thread.sleep(1000);
running = false; // تلاش برای توقف
System.out.println("Flag set to false");
}
}
📌 مشکل:
در اینجا ممکن است Thread worker هیچوقت متوقف نشود، چون مقدار running در Cache Thread گیر کرده و تغییرش در Thread اصلی دیده نمیشود.
🔎 مثال با volatile (رفتار درست)
public class WithVolatile {
private static volatile boolean running = true;
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
while (running) {
// مشغول کار
}
System.out.println("Worker stopped!");
});
worker.start();
Thread.sleep(1000);
running = false; // توقف درست انجام میشود
System.out.println("Flag set to false");
}
}
📌 توضیح:
با volatile تغییر مقدار متغیر running بلافاصله به حافظه اصلی فرستاده میشود.
بنابراین Thread worker بهمحض تغییر متغیر، مقدار جدید را میبیند و متوقف میشود.
🎯 جمعبندی
در واقع Java Memory Model مشخص میکند که Threadها چگونه حافظه را میبینند.
مشکلات اصلی در Multithreading Visibility و Reordering هستند.
کلیدواژه volatile تضمین میکند که تغییرات یک متغیر بلافاصله توسط همهی Threadها قابل مشاهده باشد و دستورات مربوط به آن بازچینی نشوند.
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
BY برنامه نویسی جاوا | Java
Share with your friend now:
tgoop.com/javapro_ir/4527