جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی

۱۰۷ مطلب با موضوع «java» ثبت شده است

modifier ها در جاوا به دو دسته کلی تقسیم بندی میشوند :

آنهایی که سطح دسترسی را تعیین میکنند

آنهایی که تاثیر در عملیات میگذارند

 

public :

private :

protected :

default :

 

strictfp : روی متد تعریف میشود و باعث میشود عملیات محاسبات اعشاری با دقت کمتری اجرا شوند و اینطوری نتیجه ای یکسان در کل سخت افزار های مختلف خواهیم داشت ولی اگر استفاده نکنیم دقت عملیات اعشاری بالاتر خواهند بود


static : متد ها و فیلد های کلاس میتوانند این modifier را داشته باشند و هنگامی استفاده میشود که برای دسترسی به آن متد با فیلد نیازی به Object جدید نداریم و زمانی از این modifier روی متد استفاده میکنیم که این متد با هیچ فیلد و Object خاصی وابستگی نداشته باشد و برای کار نیازی نیست که data type ای در حافظه Allocate شود ، از داخل متد static به فیلد های non-static دسترسی نداریم و باید بصورت آرگومان دیتا ارسال شود متد ها و فیلد های این نوع دیگر بصورت dynamic لود نمیشوند و سرعت اجرای بالاتری را دارند


final : اگر روی کلاس تعریف شود آن کلاس قابل ارث بری نیست ، اگر روی متد تعریف شود آن متد قابل override شدن نیست و اگر روی متغیر های primitive استفاده شود مقدار متغییر قابل تغییر نیست و اگر روی متغیر های reference تعریف شوند instance جدید نمیتواند به آن متغیر منتسب شود 


synchronized : جهت استفاده در thread ها میتوان یک سری عملیات را بدون تداخل با thread دیگری در یک synchronized block اجرا کرد در حقیقت یک قفل اجرای موقتی که مجوز استفاده در لحظه تنها یک ترد را ایجاد میکند تا از ورود ترد ها دیگر و تداخل در عملیات جلوگیری شود


volatile :جهت استفاده در thread ها ، هر ترد هنگام انجام عملیات یک stack مختص به خود را دارد و وقتی با متغییر ها بخواهد کار کند یک cache از آنها ایجاد میکند و با آنها کار میکند حال یک ترد دیگر ممکن است اصلاعات متغیر را تغییر دهد و این میتواند خروجی عملیات ترد قبلی را نا معتبر کند برای جلوگیری از این حالت ، میتوان آن متغیر را از نوع volatile تعیین کرد و جاوا با این نوع متغیر ها بصورت atomic ( اتمیک بودن عملیات همانطور که در بحث دیتابیس های رابطه ای هم داریم یا کل عملیات یکباره انجام میشود و یا کل عملیات انجام نمیشود ) برخورد میکند یعنی هنگامی که متغیر در حال تغییر است بقیه ترد ها حق خواندن از آن متغییر را نخواهند داشت و وقتی که مقدار جدیدی به متغییر انتساب داده شد بقیه thread ها هم آنرا بصورت بروز شده میبینند در حقیقت جاوا اجازه نمیدهد که آن متغیر در stack/cache ترد ذخیره شود و آنرا در heap نگهداری میکند البته اینکار سرعت اجرا را به مراتب کند میکند اما در مالتی ترد بودن عملیات ، اطلاعات صحت خود را حفظ میکنند


- استفاده از کلمات کلیدی final  و volatile باهم تداخل خواهد داشت چون متغییری که از نوع volatile تعیین میشود به آن معناست که در آینده تغییراتی را میپذیرد


کاربرد volatile : هنگامی که یک shared resource داریم و میخواهیم آنرا بین ترد های مختلف به اشتراک بگذاریم عملی مشابه با بلاک های synchronized ولی تفاوت با آن چیست :

- در جاهایی که فقط تغییرات shared resoruce شامل خواندن و نوشتن روی یک متغییر است نوع متغییرهای atomic بسیار بهینه تر از synchronized عملی میکنند که عموما عملیات نوشتن (تغییر متغیر) توسط یک ترد و عملیات خواندن توسط تعداد زیادی صورت میگیرد

- در متغیرهای atomic قفل بر روی read/write یک متغییر گذاشته میشود ولی در بلاک های synchronized ما میتوانیم یک مجموعه عملیات را در یک بلاک بصورت اتمیک اجرا کنیم از این رو با بلاک synchronized میتوان مسایل بزرگتر و پیچیده تری را حل کرد


نکته : در سیستم های 32 بیتی متغییر های 64 بیتی مثل long و double  در دو آدرس حافظه 32 بیتی نگهداری میشوند و در هنگام تغییر مقادیر یک متغیر 64 بیتی عملیات آن atomic نیستند و هنگامی که 32 بیت اول در حال تغییر است میتواند 32 بیت دوم توسط ترد دیگری از قبل در حال تغییر باشد و باید حواسمان باشد که در برنامه های مالتی ترد در سیستم های 32 بیتی این نوع از متغییر ها را یا از نوع AtomicLong و ... استفاده کنیم و یا از نوع volatile


transient : هنگام عملیات Serializable فیلدهای transient ذخیره نمیشوند

native : برای متد هایی که از طریق JNI با native کد ها در ارتباط هستند

 


انتزاع یا abstraction یک مفهوم است و به دنبال معنی یک لغتی برای آن نباشید و باید آنرا درک کنید تا متوجه مفهوم آن شوید. همیشه این موضوع بین توسعه دهندگان محل اختلاف و بحث بوده اگر در ابتدای راه هستید به مرور متوجه کاربرد و درک مفهوم آن میشوید  .


یک اتومبیل را فرض کنید از بخش های زیادی تشکیل شده است که هر بخش خود باز از بخش های جزیی تری تشکیل شده اند و در آینده ممکن است تکنولوژی بهتری جایگزین تکنولوژی فعلی شود ولی در هر صورت هر ماشین ترمز میخواهد حالا ممکن است امروز ترمز ماشین قدیمی باشد و در آینده ترمز با فناوری بالاتری را جایگزین کنیم . پس اینجا داشتن ترمز در ماشین یک رفتاری هست که در کلیه ماشین ها وجود دارد

هر ماشین با یک سرعت حداکثر توان حرکت کردن را دارد . سرعت صفتی است که همه ماشین ها آنرا دارند ماشینی که توان حرکت نداشته باشد یک ماشین کامل تلقی نمیشود


یکی از موارد اساسی در برنامه نویسی شی گرایی abstraction است که ما میتوانیم پیچیدگی ها را از طریق مفهوم انتزاع مدیریت کنیم. در واقع یک کلاس پایه است که وابسته به کلاس دیگری نمیباشد و درون آن چارچوب ماهیتی را مشخص میکنیم ، جزییات پیاده سازی پنهان میشوند و تنها قابلیت های برنامه را مشخص میکند


مفهوم abstraction از دو طریق در جاوا قابل اجراست کلاس های abstract و interface ها.



ادامه دارد ...

۰ نظر ۰۷ تیر ۹۸ ، ۱۸:۵۹
simple code