آشنایی با Semaphore در جاوا – راهنمای جامع


در این راهنمای کوتاه از سری مقالات آموزش جامع جاوا، به بررسی مبانی Semaphore در جاوا و همچنین mutex-ها میپردازیم.
Semaphore چیست؟
توضیح خود را از java.util.concurrent.Semaphore آغاز میکنیم. از Semaphore میتوان برای محدودسازی تعداد نخهایی که به صورت همزمان به یک منبع خاص دسترسی مییابند استفاده کرد.
در مثال زیر، یک صف لاگین ساده برای محدود کردن تعداد کاربران در سیستم پیادهسازی میکنیم:
به روش استفاده از متدهای زیر توجه کنید:
- ()tryAcquire – این متد در صورتی که یک مجوز، بیدرنگ موجود باشد، مقدار true بازگشت داده و آن را در اختیار میگیرد، در غیر این صورت مقدار false بازگشت میدهد، اما ()acquire نیازمند یک مجوز است و تا زمانی که چنین مجوزی موجود شود، مسدود میشود.
- ()release – یک مجوز را آزاد میکند.
- ()availablePermits – این متد تعداد مجوزهایی که هم اینک موجود است را بازگشت میدهد.
برای تست صف لاگین، ابتدا باید به محدودیت برسیم و بررسی کنیم آیا تلاش لاگین بعدی مسدود خواهد شد یا نه:
سپس بررسی میکنیم آیا هیچ اسلاتی پس از لاگآوت موجود است یا نه:
Semaphore زماندار
در این بخش به بررسی Apache Commons TimedSemaphore میپردازیم. TimedSemaphore به ما امکان میدهد که مانند Semaphore ساده چندین مجوز داشته باشیم، اما این مجوزها صرفاً در یک دوره زمانی مفروض موجود هستند و پس از طی شدن این دوره، زمان ریست میشود و همه مجوزها آزاد میشوند.
از TimedSemaphore میتوان برای ساختن یک صف با تأخیر مانند زیر استفاده کرد:
زمانی که از یک صف با تأخیر که دارای دوره زمانی یک ثانیهای است، استفاده میکنیم، پس از مصرف همه اسلاتهای موجود درون آن یک ثانیه، نباید چیزی موجود باشد:
اما پس از خوابیدن به مدت یک ثانیه، semaphore ریست شده و مجوزها را آزاد میکند:
Semaphore در برابر Mutex
Mutex مشابه یک semaphore دودویی عمل میکند، ما میتوانیم از آن برای پیادهسازی «انحصار متقابل» (Mutual Exclusion) استفاده کنیم. در مثال زیر، از یک semaphore ساده دودویی برای ساخت یک شمارنده استفاده کردهایم:
زمانی که تعداد زیادی نخ به صورت یکباره برای دسترسی به یک شمارنده تلاش کنند، در یک صف مسدود میشوند:
زمانی که صبر کنیم، همه نخها به شمارنده دسترسی مییابند و هیچ نخی در صف باقی نمیماند:
سخن پایانی
در این مقاله به بررسی مبانی مقدماتی semaphore در جاوا پرداختیم. کد همه موارد مطرحشده در این مقاله را میتوانید در این ریپوزیتوری گیتهاب (+) ببینید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای جاوا
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزشهای جاوا (Java)
- آموزش جامع برنامه نویسی جاوا به زبان ساده — بخش هفتم: حالت تست
- زبان برنامه نویسی جاوا (Java) — از صفر تا صد
==