Mohammed Shehata نشر 6 سبتمبر 2021 أرسل تقرير نشر 6 سبتمبر 2021 ما وظيفة كلمة synchronized في جافا 2 اقتباس
1 Ali Haidar Ahmad نشر 8 سبتمبر 2021 أرسل تقرير نشر 8 سبتمبر 2021 توفر جافا متابعة التزامن على كل كائن من فئة Object، حتى أنه يمكن استخدامها بمثابة قفل lock للتزامن. بدلاً من السماح للمبرمجين بتصميم طرق الأقفال الخاصة وإدارة كتل التزامن وتطبيق قواعد التزامن. بما أن جميع الفئات classes ترث الصف Object، وبالتالي جميع الكائنات في جافا يمكن استخدامها في التزامن. وهناك 3 طرق لتعريف كتل متزامنة في جافا: أول طريقة هي Synchronized Class Method وهنا تصبح جميع التعليمات البرمجية في هذه الدالة كتلة متزامنة و الغرض (الكائن) الذي يتم إنشاؤه من هذا الصف هو القفل. class class_name { static synchronized type method_name() { statement block } } الطريقة الثانية Synchronized Instance Method وهنا تصبح جميع التعليمات البرمجية في هذه الدالة كتلة متزامنة و ال instance object هو القفل. class class_name { synchronized type method_name() { statement block } } الطريقة الثالثة Synchronized Statement وهنا جميع التعليمات البرمجية المحددة ما بين القوسين في Synchronized تصبح كتلة متزامنة ويكون الكائن المحدد (هنا object) هو القفل. class class_name { type method_name() { synchronized (object) { statement block } } } تطبق الجافا قواعد التزامن من خلال تحديد المالك للقفل لل Thread التي تستخدم الكتلة المتزامنة ، و هنا توضيح بسيط: عند الوصول الى كتلة متزامنة في الThread المنفذة أو الحالية فانها تحاول الحصول على امتلاك هذا الكائن و إذا وجدت Thread أخرى تستخدم هذا الكائن فانها تنتظر الاخرى حتى تنتهي منه. في حالة تحرير القفل فان الThread المنتظرة تصبح مالكة لهذا القفل و تبدأ بتنفيذ مهامها عليه. في حالة الانتهاء من تنفيذ الكتلة الكتزامنة فأن القفل يتحرر مرة اخرى. يمكن ان يحتوي البرنامج الواحد على عدة كتل متزامنة، و يمكن ربط نفس القفل بعدة كتل متزامنة. مثال: في هذا المثال تم تعرف كتلتين متزامنتين، و كلاهما ارتبط بنفس القفل The Instance Object. class class_name { type method_name() { synchronized (this) { statement block 1 } } synchronized type method_name() { statement block 2 } } الكتلة رقم 1 لا يمكن ان تنفذ بنفس الوقت مع الكتلة رقم 2. أما في المثال التالي تم تعريف كتلتين و كلاهما مرتبط بقفل مختلف الأول مع كائن الفئة نفسها و الآخر مع دالة لكائن من الفئة، و الكتلتين لا ينتظران بعذهما البعض أبدا أي يمكن تنفيذهما بنفس الوقت: class class_name { type method_name() { synchronized (this) { statement block 1 } } static synchronized type method_name() { statement block 2 } } اقتباس
0 شرف الدين حفني نشر 6 سبتمبر 2021 أرسل تقرير نشر 6 سبتمبر 2021 كلمة synchronized تستخدم من أجل منع أن يقوم اكثر من thread بالدخول إلى الدالة في نفس الوقت فمثلاً إن كان لدينا الكود اﻵتي public void getNumber() { setNumber(getNumber() + 1); } والذي يقوم بحساب عدد المرات التي يتم نداء الدالة فيها ,وكان لدينا إثنان threads وكلاً منهما حاول الدخول إلى نفس الدالة في ذات الوقت, وكان لدينا قيمة إبتدائية Number تساوي 5, فإذا من المفترض أن تكون قيمة الرقم ب7 , لكن بسبب دخول كﻻً من الthreads في نفس ذات الوقت نجد أن الرقم أصبح 6, لو كانت تلك المعلومات حساسة سيتسبب ذلك في مشاكل كثيرة , ولحل تلك المشكلة نقوم بجعلها thread safe عن طريق إضافة الكلمة synchronized والتي بدورها تجعل الدالة غير قابل الدخول عليها من قِبل أكثر من thread فيكون شكلها كالأتي public synchronized void getNumber() { setNumber(getNumber() + 1); } ومن الممكن أيضا إضافة الكلمة إلى blockمن الكود ليس دالة فقط, public void getTheCountOfThreads(){ synchronized (this) { setCount(getCount()+1); } } اقتباس
السؤال
Mohammed Shehata
ما وظيفة كلمة synchronized في جافا
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.