السلام عليكم
يصف هذا الجزء كلمة "تزامن" و كيف تدعم الجافا التزامن في ثلاث طرق مختلفة
- دوال الصنف المتزامنة (synchronized class methods)
- نماذج الدوال المتزامنة (synchronized instance methods)
- كتل البيانات المتزامنة (synchronized statement blocks)
بدلا من السماح للمبرمجين لتصميم طرق الأقفال الخاصة ، وإدارة كتل التزامن ، وتطبيق قواعد التزامن ، توفر الجافا متابعة التزامن على كل كائن من فئة Object، حتى أنه يمكن أستخدامها بمثابة قفل للتزامن.
منذ جميع الطبقات والفئات هي عبارة عن امتداد ل Object ، جميع الكائنات في جافا يمكن استخدامها في التزامن.
توفر الجافا ثلاث طرق لتحديد كتل متزامنة
Synchronized Class Method:
class class_name { static synchronized type method_name() { statement block }}جميع الجمل في هذه الدالة تصبح كتلة التزامن و فئة الكائن هي القفل.Synchronized Instance Method:
class class_name { synchronized type method_name() { statement block }}جميع الجمل في هذه الدالة تصبح كتلة التزامن و فئة الكائن هي القفل.Synchronized Statement:
class class_name { type method_name() { synchronized (object) { statement block } }}جميع الجمل المحددة ما بين القوسين في جملة التزامن تصبح كتلة متزامنة و الكائن من فئة object يصبح القفل.تطبق الجافا قواعد التزامن من خلال تحديد المالك للقفل لل 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 }}من شرح Dr. Herong Yang


