با طعم کد!

سینگلتون دوست‌داشتنی! قسمت دوم

در قسمت قبلی این نوشته توضیح دادم که سینگلتون چقدر دوست داشتنی و مفید است و می‌تواند به درد بخور باشد. و در این قسمت می‌خواهم بیشتر درباره بهینه کردن و افزایش کارایی سینگلتون روی زیبان کاتلین صحبت کنم.

خب به جایی رسیدیم که جریان ساخت و ایجاد یک نمونه از آبجکت سینگلتون ما در محیط‌های multi-thread به بهترین شکل انجام شد، اما synchronized بودن تمام این فرایند علاوه‌بر اینکه برای ما الزامی نیست، بلکه باعث کند شدن دسترسی هر thread به مقدار نمونه خواهد شد. می‌توان گفت که بعد از عمل ایجاد و ساخت متغیر، بقیه مراحل نباید الزامی به synchronized بودن داشته باشند.

راه حل آسان و سریع برای این کار شاید این مورد باشد که متغیر INSTANCE را به صورت eager (در زمان شروع برنامه) مقدار دهی کنیم:

در خط شماره ۴ میتوانید به وضوح مشاهده کنید که مقداردهی متغیر INSTANCE چگونه از حالت Lazy به Eager تغییر کرده است. در این مورد، JVM اطمینان حاصل می‌کند که هر Thread از برنامه فقط زمانی به متغیر INSTANCE دسترسی پیدا کند که این متغیر مقداردهی اولیه را پشت سر گذاشته است، اما مشکل اینجاست که ما تصمیم گرفتیم مقداردهی متغیر را از زمان شروع برنامه به زمانی که لازم است به تاخیر بیاندازیم، که کد بالا مخالف این تصمیم ماست.

نگاهی دوباره به مراحلی که تا به اینجا طی کردیم، می‌تواند کمک‌ زیادی در نتیجه‌گیری جدید داشته باشد، به قطعه کد زیر دقت کنید:

همانطور که در کد بالا می‌بینید، هماهنگ‌سازی از طریق قفل synchronized در مرحله مقدار دهی به متغیر اعمال شده و دوباره به حالت Lazy بازگشته است. اما مقدار annotation (حاشیه‌نویسی) @Volatile در اینجا چه نقشی دارد؟ دقیقا برابر مفهوم Volatile در جاوا، این هملگر نیز وظیفه مشابهی دارد. همانطور که می‌دانید هر Thread از برنامه ما یک کپی از متغیر ما را در هنگام اجرا در حافظه در اختیار خواهد گرفت و همه مقادیر نیز در هنگام ساختن Thrad جدید در آن متغیر کپی خواهد شد. استفاده از مقدار @Volatile دقیقا مثل این است که بگوییم: مقدار این متغیر ممکن است در Thread دیگری از برنامه تغییر کند! و طمینان حاصل می‌کنیم که مقدار متغیر در حافظه بروزرسانی شود!

حالا نوبت استفاده از ویژگی‌های شیرین کاتلین است! من واقعا از استفاده از !! درست روبه‌روی مقدار بازگشتی متد احساس خوبی ندارم، نه اینکه این‌کار اشتباه باشد، ولی واقعا روش بهتر و جالبتری برای این کار وجود ندارد؟

خب این هم از این مورد! 🙂 بهترین روش ساخت یک سینگلتون در کاتلین! البته همانطور که گفتم، پیاده‌سازی بهترین سینگلتون بسته به این که شما چه هدفی دارید و در چه محیطی (multi-thread و یا خیر) از سینگلتون استفاده می‌کنید و یا چه چیزی برای شما در اولویت است فرق می‌کند. اما اگر شما هم مثل من همیشه به دنبال تعریف اصلی و کامل هر چیز هستید، الان بهترین روش تولید یک سینگلتون را در اختبار دارید و امیدوارم برای شما هم یه همان اندازه که برای من مفید بوده، مفید و کارامد واقع شود.

برچسب ها
نمایش بیشتر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

بستن
بستن