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: |

Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. A vandalised bank during the 2019 protest. File photo: May James/HKFP. Ng was convicted in April for conspiracy to incite a riot, public nuisance, arson, criminal damage, manufacturing of explosives, administering poison and wounding with intent to do grievous bodily harm between October 2019 and June 2020. “Hey degen, are you stressed? Just let it all out,” he wrote, along with a link to join the group. Ng Man-ho, a 27-year-old computer technician, was convicted last month of seven counts of incitement charges after he made use of the 100,000-member Chinese-language channel that he runs and manages to post "seditious messages," which had been shut down since August 2020.
from us


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