JAVAPRO_IR Telegram 4527
🧠 مدل حافظه در جاوا (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
👍6



tgoop.com/javapro_ir/4527
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

The visual aspect of channels is very critical. In fact, design is the first thing that a potential subscriber pays attention to, even though unconsciously. In handing down the sentence yesterday, deputy judge Peter Hui Shiu-keung of the district court said that even if Ng did not post the messages, he cannot shirk responsibility as the owner and administrator of such a big group for allowing these messages that incite illegal behaviors to exist. The court said the defendant had also incited people to commit public nuisance, with messages calling on them to take part in rallies and demonstrations including at Hong Kong International Airport, to block roads and to paralyse the public transportation system. Various forms of protest promoted on the messaging platform included general strikes, lunchtime protests and silent sit-ins. Private channels are only accessible to subscribers and don’t appear in public searches. To join a private channel, you need to receive a link from the owner (administrator). A private channel is an excellent solution for companies and teams. You can also use this type of channel to write down personal notes, reflections, etc. By the way, you can make your private channel public at any moment. Channel login must contain 5-32 characters
from us


Telegram برنامه نویسی جاوا | Java
FROM American