الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

"synchronized" - كيف تدعم جافا التزامن

بدأه .S.T.A.L.K.E.R في 6 مارس 2010 · 10 رد · 5,969 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

يصف هذا الجزء كلمة "تزامن" و كيف تدعم الجافا التزامن في ثلاث طرق مختلفة

- دوال الصنف المتزامنة (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

4
#2

جزاك الله خيراً أخ محمد

موضوع التزامن syncronisation والمسالك/الخيوط threads من الأمور الهامة الغامضة وقليلة الاستخدام بالنسبة لكثير من مبرمجي جافا ! (وأنا منهم:) )

الموضوع جيد ولكن أظن أنه بحاجة لتمهيد تشرح فيه قليلاً عن "القفل" و "قواعد التزامن" ... وإعادة صياغة الترجمة إلى العربية بشكل أفضل :wacko:

#3
اقتباس
وإعادة صياغة الترجمة إلى العربية بشكل أفضل

المشكلة ان بعض الكلمات لم استطع ترجمتها بشكل مناسب مثلا

instance class object

ماذا تترجم ؟؟ :blink:

ときに、日本語を調べるのだろうか?

دعني اوضح بعض المصطلحات:

الكتلة المتزامنة : عبارة عن مجموعة اسطر من اللغة و هي عبارات توجد في منطقة متزامنة سواء ما بين قوسين او داخل دالة متزامنة.

القفل: عبارة عن الكائن اللذي يهمنا بأن الا يستخدم مرتين في نفس الوقت و هو امتداد لكائن Object (اي جميع الكائنات في جافا بما ان الكائن الاساسي هو فئة Object)

قواعد التزامن : هي الاسس التي تم بناء التزامن في الجافا عليها

#4

instance class object : غرض من صف

بالنسبة لسؤالك الآخر ... فما زلت مبتدأً جداً على ذلك ... مازلت بالأحرف وعبارات الترحيب :D

لكني أتعلم بسرعة ... بسرعة الضوء !!

#5

الف شكر يا محمد باشا

سبـــــحــــان الله و بحمده سبحان الله العظيم

403100468.gif

#6

اقترح عليك الترجمة التالية

دالة متزامنة على مستوى الفئة synchronized method class

و دالة متزامنة على مستوى الكائن synchronized method object

أريد أن أضيف نقطتين

النقطة الأولى

ليس انتهاء الكتلة من يحرر الكائن فقط استخدام الدالة wait يفعل أيضاً

بمعنى لو كنت في وسط كتلة متزامنة synchronized block (بغض النظر عن نوعه) وقمت بمناداة wait فإن الكتل المتزامنة الأخرى تستطيع البدء بالعمل مباشرة

النقطة الثانية

الدوال المتزامنة ماهي في حقيقة الأمر إلا كتل متزامنة

فكل نوع منها يحول إلى كتلة متزامنة بطريقة مختلفة

مثال

class class_name {
   synchronized  type method_name() {
            statement block 1
      }
   static synchronized type method_name() {
      statement block 2
   }
}

يحول إلى

class class_name {
   type method_name() {
      synchronized (this) {
         statement block 1
      }
   }
   static type method_name() {
   synchronized (class_name.class)//class is object of class Class
      statement block 2
   }
}

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

جزاكم الله خيرا, لقد أستفدت فعلا

#9

يعطيك العافية اخي على الموضوع

بالنسبة لل synchronization

الافضل ان المبرمج يبحث عما يحتاج له في java.util.concurrent

واذا لم يجد كل ما يحتاجه فيمكنه استخدام الطرق المذكورة لكن اغلب الظن ان استخدام الادوات الموجودة في هذه package سيكون اسهل وافضل اداء

#11

الكتاب ده بيتكلم عن عدة مواضيع خاصه بالجافا, و من ضمنها ال Sync

Effective Java™ Second Edition Addison Wesley ISBN-13: 978-0-321-35668-0 ISBN-10: 0-321-35668-3

كما أن ال JLS فيها شرح كويس لل Sync :

http://java.sun.com/docs/books/jls/third_edition/html/memory.html#61803

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.3.1.4

2

مواضيع مشابهة