Notice: file_put_contents(): Write of 5185 bytes failed with errno=28 No space left on device in /var/www/tgoop/post.php on line 50

Warning: file_put_contents(): Only 16384 of 21569 bytes written, possibly out of free disk space in /var/www/tgoop/post.php on line 50
جاواپرو | برنامه نویسی جاوا | Java@javapro_ir P.4678
JAVAPRO_IR Telegram 4678
📘 آشنایی با ThreadLocal و نقش آن در Thread-Safe بودن داده‌ها

در برنامه‌نویسی همزمانی (Concurrency) در جاوا، یکی از چالش‌های مهم این است که هر Thread بتواند داده‌های مخصوص خود را داشته باشد، بدون آن‌که این داده‌ها میان Threadهای مختلف به اشتراک گذاشته شود. کلاس ThreadLocal برای حل دقیق همین مسئله طراحی شده و یکی از ابزارهای بسیار قدرتمند و ظریف در ساخت برنامه‌های Thread-Safe محسوب می‌شود.


✳️ ۱. ThreadLocal چیست؟

در حالت عادی، اگر چند Thread به یک متغیر مشترک دسترسی داشته باشند، احتمال بروز مشکلاتی مانند Race Condition وجود دارد. کلاس ThreadLocal با نگه‌داشتن یک نسخهٔ مجزا از داده برای *هر Thread*، این مشکل را کاملاً حذف می‌کند.

هر Thread یک مقدار مستقل دارد و تغییر مقدار توسط یک Thread، هیچ تأثیری روی Threadهای دیگر ندارد. این رفتار شبیه داشتن یک «کپی خصوصی» از متغیر برای هر Thread است.


✳️ ۲. کاربرد اصلی ThreadLocal

متداول‌ترین کاربرد ThreadLocal، نگهداری داده‌هایی است که هر Thread به‌صورت جداگانه به آن‌ها نیاز دارد؛ مانند:

* نگهداری Session کاربر در یک سرویس چندریسمانی
* ذخیرهٔ اطلاعات Request در وب‌سرورها
* مدیریت تاریخ و زمان با کلاس‌هایی که Thread-Safe نیستند (مثل SimpleDateFormat)
* نگهداری موقت داده در طول اجرای یک Thread بدون نیاز به Passing در پارامترها


✳️ ۳. مثال کاربردی: ذخیره‌سازی داده خصوصی برای هر Thread

در مثال زیر، هر Thread یک مقدار مستقل دارد و تغییر مقدار یک Thread روی دیگری اثر نمی‌گذارد:


public class ThreadLocalExample {
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

public static void main(String[] args) {
Runnable task = () -> {
int value = threadLocal.get();
threadLocal.set(value + 1);
System.out.println(Thread.currentThread().getName() + " → " + threadLocal.get());
};

new Thread(task, "Thread-A").start();
new Thread(task, "Thread-B").start();
new Thread(task, "Thread-C").start();
}
}


اجرای این برنامه خروجی زیر را می‌دهد:


Thread-A → 1
Thread-B → 1
Thread-C → 1


هر Thread مقدار جداگانه‌ای دارد و هیچ‌گونه اشتراک داده‌ای رخ نمی‌دهد.


✳️ ۴. مثال پیشرفته: حل مشکل Thread-Safety در SimpleDateFormat

کلاس SimpleDateFormat به‌صورت پیش‌فرض Thread-Safe نیست. بنابراین برای استفاده در محیط همزمانی، ThreadLocal یکی از بهترین راه‌حل‌هاست.


private static final ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));

public static String format(Date date) {
return dateFormat.get().format(date);
}


در اینجا هر Thread یک نمونهٔ مستقل از SimpleDateFormat دارد و مشکل رقابت (Race Condition) کاملاً از بین می‌رود.


✳️ ۵. نکته بسیار مهم: مدیریت حافظه و جلوگیری از Memory Leak

در استفاده از ThreadLocal باید بسیار دقت کرد، زیرا اگر مقدار ذخیره‌شده در ThreadLocal پس از پایان کار Thread حذف نشود، ممکن است مشکلات Memory Leak به‌وجود بیاید؛ به‌خصوص در محیط‌هایی مانند سرورهای وب که Thread Pool استفاده می‌شود.

بهترین روش این است که همیشه پس از پایان کار مقدار ThreadLocal را پاک کنیم:


try {
// work
} finally {
threadLocal.remove();
}


این کار از باقی‌ماندن داده در ThreadPool جلوگیری می‌کند.


✳️ ۶. جمع‌بندی

درک و استفادهٔ درست از ThreadLocal یکی از مهارت‌های مهم در ساخت سیستم‌های چندریسمانی پایدار است:

* هر Thread یک نسخهٔ خصوصی از داده دارد.
* هیچ تداخلی بین Threadها ایجاد نمی‌شود.
* مناسب برای داده‌های حساس، مانند Request Context یا Formatterها.
* نیازمند مدیریت دقیق برای جلوگیری از Memory Leak.

#کاربرـحرفهـای


🆔 @javapro_ir
🆔 @group_javapro
👍51



tgoop.com/javapro_ir/4678
Create:
Last Update:

📘 آشنایی با ThreadLocal و نقش آن در Thread-Safe بودن داده‌ها

در برنامه‌نویسی همزمانی (Concurrency) در جاوا، یکی از چالش‌های مهم این است که هر Thread بتواند داده‌های مخصوص خود را داشته باشد، بدون آن‌که این داده‌ها میان Threadهای مختلف به اشتراک گذاشته شود. کلاس ThreadLocal برای حل دقیق همین مسئله طراحی شده و یکی از ابزارهای بسیار قدرتمند و ظریف در ساخت برنامه‌های Thread-Safe محسوب می‌شود.


✳️ ۱. ThreadLocal چیست؟

در حالت عادی، اگر چند Thread به یک متغیر مشترک دسترسی داشته باشند، احتمال بروز مشکلاتی مانند Race Condition وجود دارد. کلاس ThreadLocal با نگه‌داشتن یک نسخهٔ مجزا از داده برای *هر Thread*، این مشکل را کاملاً حذف می‌کند.

هر Thread یک مقدار مستقل دارد و تغییر مقدار توسط یک Thread، هیچ تأثیری روی Threadهای دیگر ندارد. این رفتار شبیه داشتن یک «کپی خصوصی» از متغیر برای هر Thread است.


✳️ ۲. کاربرد اصلی ThreadLocal

متداول‌ترین کاربرد ThreadLocal، نگهداری داده‌هایی است که هر Thread به‌صورت جداگانه به آن‌ها نیاز دارد؛ مانند:

* نگهداری Session کاربر در یک سرویس چندریسمانی
* ذخیرهٔ اطلاعات Request در وب‌سرورها
* مدیریت تاریخ و زمان با کلاس‌هایی که Thread-Safe نیستند (مثل SimpleDateFormat)
* نگهداری موقت داده در طول اجرای یک Thread بدون نیاز به Passing در پارامترها


✳️ ۳. مثال کاربردی: ذخیره‌سازی داده خصوصی برای هر Thread

در مثال زیر، هر Thread یک مقدار مستقل دارد و تغییر مقدار یک Thread روی دیگری اثر نمی‌گذارد:


public class ThreadLocalExample {
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

public static void main(String[] args) {
Runnable task = () -> {
int value = threadLocal.get();
threadLocal.set(value + 1);
System.out.println(Thread.currentThread().getName() + " → " + threadLocal.get());
};

new Thread(task, "Thread-A").start();
new Thread(task, "Thread-B").start();
new Thread(task, "Thread-C").start();
}
}


اجرای این برنامه خروجی زیر را می‌دهد:


Thread-A → 1
Thread-B → 1
Thread-C → 1


هر Thread مقدار جداگانه‌ای دارد و هیچ‌گونه اشتراک داده‌ای رخ نمی‌دهد.


✳️ ۴. مثال پیشرفته: حل مشکل Thread-Safety در SimpleDateFormat

کلاس SimpleDateFormat به‌صورت پیش‌فرض Thread-Safe نیست. بنابراین برای استفاده در محیط همزمانی، ThreadLocal یکی از بهترین راه‌حل‌هاست.


private static final ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));

public static String format(Date date) {
return dateFormat.get().format(date);
}


در اینجا هر Thread یک نمونهٔ مستقل از SimpleDateFormat دارد و مشکل رقابت (Race Condition) کاملاً از بین می‌رود.


✳️ ۵. نکته بسیار مهم: مدیریت حافظه و جلوگیری از Memory Leak

در استفاده از ThreadLocal باید بسیار دقت کرد، زیرا اگر مقدار ذخیره‌شده در ThreadLocal پس از پایان کار Thread حذف نشود، ممکن است مشکلات Memory Leak به‌وجود بیاید؛ به‌خصوص در محیط‌هایی مانند سرورهای وب که Thread Pool استفاده می‌شود.

بهترین روش این است که همیشه پس از پایان کار مقدار ThreadLocal را پاک کنیم:


try {
// work
} finally {
threadLocal.remove();
}


این کار از باقی‌ماندن داده در ThreadPool جلوگیری می‌کند.


✳️ ۶. جمع‌بندی

درک و استفادهٔ درست از ThreadLocal یکی از مهارت‌های مهم در ساخت سیستم‌های چندریسمانی پایدار است:

* هر Thread یک نسخهٔ خصوصی از داده دارد.
* هیچ تداخلی بین Threadها ایجاد نمی‌شود.
* مناسب برای داده‌های حساس، مانند Request Context یا Formatterها.
* نیازمند مدیریت دقیق برای جلوگیری از Memory Leak.

#کاربرـحرفهـای


🆔 @javapro_ir
🆔 @group_javapro

BY جاواپرو | برنامه نویسی جاوا | Java


Share with your friend now:
tgoop.com/javapro_ir/4678

View MORE
Open in Telegram


Telegram News

Date: |

Add the logo from your device. Adjust the visible area of your image. Congratulations! Now your Telegram channel has a face Click “Save”.! The imprisonment came as Telegram said it was "surprised" by claims that privacy commissioner Ada Chung Lai-ling is seeking to block the messaging app due to doxxing content targeting police and politicians. Those being doxxed include outgoing Chief Executive Carrie Lam Cheng Yuet-ngor, Chung and police assistant commissioner Joe Chan Tung, who heads police's cyber security and technology crime bureau. Don’t publish new content at nighttime. Since not all users disable notifications for the night, you risk inadvertently disturbing them. How to Create a Private or Public Channel on Telegram?
from us


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