اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

توفر جافا متابعة التزامن على كل كائن من فئة 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
نشر

كلمة 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);
    }
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...