المزامنة في Java: ماذا وكيف ولماذا؟



ستساعدك هذه المقالة حول المزامنة في Java على توجيه طريقك للتعرف على مزامنة البرامج متعددة الخيوط.

قد تأتي البرامج متعددة الخيوط بانتظام مع ظروف متعددة محاولة الوصول إلى نفس المورد الذي ينتج عنه نتائج احتيالية ومذهلة. يمكن حل ذلك باستخدام المزامنة في Java. يمكن فقط لخيط واحد محدد الوصول إلى المورد في غرض معين من الوقت. ستساعدك هذه المقالة في التعرف على استراتيجية المزامنة.

سأناقش المواضيع بهذا الترتيب:





هيا بنا نبدأ!

لماذا استخدام التزامن في جافا؟



إذا بدأت بخيطين على الأقل داخل أحد البرامج ، فقد تكون هناك فرصة عندما تحاول سلاسل رسائل متعددة الوصول إلى نفس المورد. يمكن أن تخلق حتى نتيجة غير متوقعة بسبب مشاكل التزامن.

بناء الجملة :

متزامن (معرف الكائن) {// الوصول إلى المتغيرات المشتركة والموارد المشتركة الأخرى}

فمثلا، محاولة الكتابة داخل ملف مكافئ. قد يؤدي هذا إلى تلف البيانات نظرًا لأن أحد الخيوط يمكنه تجاوز البيانات أو عند فتح مؤشر ترابطنفس الملف في نفس الوقت ، قد يكون موضوع آخر يغلق نفس الملف.هناك حاجة لمزامنة عمل مؤشرات الترابط المتعددة. يمكن تنفيذ هذا باستخدام مفهوم يسمى م المعلقون .



  • كل مرتبط بجهاز عرض يمكن للخيط قفله أو فتحه.
  • قد يحمل خيط واحد فقط في كل مرة قفلًا على الشاشة.
  • جافا توفر لغة البرمجة طريقة سهلة للغاية لإنشاء سلاسل رسائل ومزامنة مهمتها باستخدام متزامن كتل.
  • كما أنها تحافظ على الموارد المشتركة داخل هذه الكتلة المعينة.

يتم تمييز الكتل المتزامنة في Java بامتداد متزامن كلمة رئيسية. تمت مزامنة هذه الكتلة في Java على بعض الكائنات.كل الكتل التي تتم مزامنتها على نفس الكائن يمكن أن يكون لها مؤشر ترابط واحد يتم تنفيذه بداخلها في كل مرة. يتم حظر جميع مؤشرات الترابط الأخرى التي تحاول الدخول إلى الكتلة المتزامنة حتى يخرج مؤشر الترابط داخل الكتلة المتزامنة من الكتلة.

أنواع التزامن

يتوفر نوعان أساسيان من المزامنة. هم انهم:

  1. تزامن العملية: التنفيذ المتزامن لخيوط أو عمليات متعددة للوصول إلى حالة بحيث تلتزم بسلسلة معينة من الإجراءات.
  2. تزامن الموضوع: في الأوقات التي يكون فيها أكثر من موضوع واحديحاول الوصول إلى مورد مشترك ، فأنت بحاجة إلى التأكد من استخدام هذا المورد بواسطة مؤشر ترابط واحد فقط فيوقت.

دعونا لا ندخل في تفاصيل هذه الأنواع ونحاول فهم ما الذي يتم تأمينه .

أقفال في جافا

كما ذكرت سابقًا ، تم بناء التزامن حول كيان داخلي يعرف باسم قفل أو مراقب . كل كائن لديه قفل مرتبط به. لذا فإن الخيط الذي يحتاج إلى وصول ثابت إلى حقول الكائن يحتاج إلى الحصول على قفل الكائن قبل الوصول إليها ، ثم تحرير القفل عند انتهاء العمل.

من Java 5 ، تحتوي الحزمة java.util.concurrent.locks على العديد من تطبيقات القفل.

هكذا يبدو القفل:

قفل فئة عامة {منطقية خاصة isLocked = قفل باطل عام متزامن خاطئ () يلقي InterruptException {while (isLocked) {wait ()} isLocked = true} () {isLocked = false notify ()}}

تقوم طريقة lock () بتأمين مثيل Lock بحيث يتم حظر جميع سلاسل العمليات التي تستدعي lock () حتى يتم تنفيذ unlock ().

متعدد خيوط المعالجة دون التزامن

فيما يلي مثال بسيط يطبع قيمة العداد في تسلسل وفي كل مرة نقوم بتشغيلها ، ينتج عنها نتيجة مختلفة بناءً على توفر وحدة المعالجة المركزية في مؤشر ترابط. تحقق من هذا!

class Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

نتائج البرنامج أعلاه في هذا:

الإخراج- التزامن في Java- Edureka

متعدد خيوط المعالجة مع التزامن

هذا هو نفس المثال أعلاه ولكنه يطبع قيمة العداد في التسلسل. في كل مرة نقوم بتشغيلها ، ينتج عنها نفس النتيجة.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (استثناء هـ) {System. خارج.طباعة MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} بداية الفراغ العامة () {System.out.println ('بدء' + threadName) إذا (t == null) {t = new Thread (this، threadName) t.start ()}}} فئة عامة TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 '، MT) الموضوع T1 = موضوع جديد (' Thread - 2 '، MT) T.start () T1.start () // انتظر حتى تنتهي المواضيع حاول {T.join () T1.join ()} catch (استثناء هـ) {System.out.println ('Interrupt')}}}

الإخراج موضح أدناه:

الكلمات الرئيسية المتزامنة

الكلمات الرئيسية المتزامنة يمثل كتلة أو طريقة قسمًا مهمًا. القسم الحرج هو المكان الذي يتم فيه تنفيذ مؤشر ترابط واحد فقط في كل مرة ، ويحمل مؤشر الترابط قفل القسم المتزامن. هذه متزامن الكلمات الرئيسية تساعد في الكتابة منافس أجزاء من أي تطبيق. كما أنه يحمي الموارد المشتركة داخل الكتلة.

يمكن استخدام الكلمة الأساسية المتزامنة مع:

دعونا نناقش كتلة التعليمات البرمجية.

الكلمات الرئيسية المتزامنة: كتلة التعليمات البرمجية

بناء الجملة

الصيغة العامة لكتابة كتلة متزامنة هي:

متزامنة (lockObject) {// Synchronized statement}

عندما يريد مؤشر ترابط تنفيذ العبارات المتزامنة داخل الكتلة ، يجب أن يحصل على القفل على شاشة lockObject's. يمكن لخيط واحد فقط الحصول على شاشة كائن قفل في المرة الواحدة. لذلك يجب أن تنتظر جميع مؤشرات الترابط الأخرى حتى يكتسب الخيط المنفذ حاليًا القفل وينتهي من تنفيذه.
بهذه الطريقة ، فإن متزامن تضمن الكلمة الأساسية أن مؤشر ترابط واحد فقط سوف ينفذ عبارات الكتلة المتزامنة في وقت واحد ، وبالتالي يمنع سلاسل رسائل متعددة من إتلاف البيانات المشتركة الموجودة داخل الكتلة.

ملحوظة :

  • إذا تم وضع الخيط على وضع السكون (باستخدام ينام() طريقة) ثم لا تحرر القفل. خلال وقت السكون هذا ، لن يقوم أي مؤشر ترابط بتنفيذ عبارات الكتلة المتزامنة.
  • سوف تزامن جافا رمي NullPointerException إذا تم استخدام عنصر القفل في متزامن (قفل) ' باطل.

الآن ، دعونا نناقش الطريقة.

الكلمات الرئيسية المتزامنة: طريقة

بناء الجملة

كيفية مزج البيانات في اللوحة

الصيغة العامة لكتابة أ طريقة متزامنة يكون:

الطريقة المتزامنة (المعلمات) {// الرمز المتزامن}

هنا lockObject هو مجرد إشارة إلى كائن يرتبط قفله بالشاشة التي تمثل البيانات المتزامنة.

على غرار الكتلة المتزامنة ، يجب أن يكتسب مؤشر الترابط القفل على كائن الشاشة المتصل بالطريقة المتزامنة. في حالة الطريقة المتزامنة ، يكون كائن القفل:

  • كائن '.class' - إذا كانت الطريقة المعطاة ثابتة .
  • كائن 'هذا' - إذا كانت الطريقة غير ثابت . 'هذا' هو المرجع للكائن الحالي الذي يتم فيه استدعاء الطريقة المتزامنة.

جافا الكلمات الأساسية المتزامنة هي إعادة الدخول في الطبيعة. هذا يعني أنه إذا كانت الطريقة المتزامنة تستدعي طريقة أخرى متزامنة تتطلب نفس القفل ، فإن الخيط الحالي الذي يحمل القفل يمكنه الدخول في هذه الطريقة دون الحصول على القفل.

دعنا ننتقل إلى الموضوع الأخير من هذه المقالة ونشير إلى الاختلافات الرئيسية بين الكلمة الأساسية المتزامنة وكتلة المزامنة.

الفرق بين الكلمات الرئيسية المتزامنة والكتلة المتزامنة

  • عند استخدام الكلمات الأساسية المتزامنة مع ملف طريقة ، فإنه يكتسب قفلًا في الكائن للطريقة بأكملها. هذا يعني أنه لا يمكن لأي مؤشر ترابط آخر استخدام أي طريقة متزامنة حتى ينتهي مؤشر الترابط الحالي الذي تم استدعاؤه من تنفيذه.
  • متزامن منع يكتسب قفلًا في الكائن فقط بين قوسين بعد تحديد الكلمة الأساسية المتزامنة. هذا يعني أنه لا يمكن لأي مؤشر ترابط آخر الحصول على قفل على الكائن المقفل بالفعل حتى يتم إنهاء الكتلة. لكن الخيوط الأخرى ستكون قادرة على الوصول إلى باقي الكود الموجود في الطريقة.

يقودنا هذا إلى نهاية هذه المقالة حيث ناقشنا كيفية عمل المزامنة في Java بالضبط. آمل أن تكون واضحًا بشأن كل ما تمت مشاركته معك في هذا البرنامج التعليمي.

تفحص ال من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. نحن هنا لمساعدتك في كل خطوة في رحلتك ، لكي تصبح بجانب أسئلة المقابلة في جافا هذه ، توصلنا إلى منهج مصمم للطلاب والمهنيين الذين يريدون أن يصبحوا مطور جافا.

لديك سؤال لنا؟ يرجى ذكرها في قسم التعليقات من هذا “التزامن في جافا ' مقال وسنعاود الاتصال بك في أقرب وقت ممكن.