دليل شامل للمزامنة في جافا

نشرت: 2022-05-20

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

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

سوف يستكشف هذا الدليل حول ما هو التزامن في Java مفهوم المزامنة بالتفصيل مع الأمثلة.

جدول المحتويات

ما هو التزامن في جافا؟

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

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

بناء الجملة لكتابة كتلة متزامنة

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

متزامن (lockObject)

{

// البيانات المتزامنة

}

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

أقفال في جافا

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

تعلم دورات تطوير البرمجيات عبر الإنترنت من أفضل الجامعات في العالم. اربح برامج PG التنفيذية أو برامج الشهادات المتقدمة أو برامج الماجستير لتتبع حياتك المهنية بشكل سريع.

طريقة جافا المتزامنة

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

فيما يلي مثال على طريقة Java المتزامنة:

// مثال على طريقة جافا المتزامنة

جدول الفصل {

printTable باطل متزامن (int n) {// الطريقة المتزامنة

لـ (int i = 1 ؛ i <= 5 ؛ i ++) {

System.out.println (n * i) ؛

محاولة{

Thread.sleep (400) ؛

} catch (استثناء هـ) {System.out.println (e)؛}

}

}

}

تمدد فئة MyThread1 سلسلة الرسائل {

لوح؛

MyThread1 (الجدول ر) {

this.t = t ؛

}

تشغيل باطل عام () {

t.printTable (5) ؛

}

}

تمدد فئة MyThread2 سلسلة الرسائل {

لوح؛

MyThread2 (الجدول ر) {

this.t = t ؛

}

تشغيل باطل عام () {

t.printTable (100) ؛

}

}

فئة عامة TestSynchronization2 {

العامة الثابتة الفراغ الرئيسي (سلاسل سلسلة []) {

كائن الجدول = جدول جديد () ؛ // كائن واحد فقط

MyThread1 t1 = جديد MyThread1 (obj) ؛

MyThread2 t2 = جديد MyThread2 (obj) ؛

t1.start () ؛

t2.start () ،

}

}

انتاج:

5

10

15

20

25

100

200

300

400

500

ماذا يحدث بدون التزامن؟

الآن ، دعنا ننظر إلى البرنامج السابق بدون مزامنة (لاحظ عدم وجود الكلمة الأساسية المتزامنة).

جدول الفصل {

باطل printTable (int n) {// طريقة غير متزامنة

لـ (int i = 1 ؛ i <= 5 ؛ i ++) {

System.out.println (n * i) ؛

محاولة{

Thread.sleep (400) ؛

} catch (استثناء هـ) {System.out.println (e)؛}

}

}

}

تمدد فئة MyThread1 سلسلة الرسائل {

لوح؛

MyThread1 (الجدول ر) {

this.t = t ؛

}

تشغيل باطل عام () {

t.printTable (5) ؛

}

}

تمدد فئة MyThread2 سلسلة الرسائل {

لوح؛

MyThread2 (الجدول ر) {

this.t = t ؛

}

تشغيل باطل عام () {

t.printTable (100) ؛

}

}

فئة TestSynchronization1 {

العامة الثابتة الفراغ الرئيسي (سلاسل سلسلة []) {

كائن الجدول = جدول جديد () ؛ // كائن واحد فقط

MyThread1 t1 = جديد MyThread1 (obj) ؛

MyThread2 t2 = جديد MyThread2 (obj) ؛

t1.start () ؛

t2.start () ،

}

}

انتاج:

5

100

10

200

15

300

20

400

25

500

كما ترى ، الإخراج غير متناسق بدون المزامنة.

استكشف دوراتنا التدريبية الشهيرة في هندسة البرمجيات

SL. رقم برامج تطوير البرمجيات
1 ماجستير العلوم في علوم الكمبيوتر من جامعة جون مورس بليفربول و IIITB برنامج شهادة الأمن السيبراني من معهد كاليفورنيا للتكنولوجيا CTME
2 برنامج تدريب تطوير المكدس الكامل برنامج PG في Blockchain
3 برنامج الدراسات العليا التنفيذية في تطوير البرمجيات - تخصص في DevOps عرض جميع دورات هندسة البرمجيات

أنواع التزامن في جافا

للإجابة عن تزامن الخيط في Java ، لدينا نوعان متاحان من المزامنة: مزامنة الخيط ومزامنة العملية.

دعونا نفهم ما يعنيه كل منهما.

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

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

طرق التزامن في جافا

بشكل عام ، هناك أربع طرق للمزامنة في Java:

  • طرق ثابتة متزامنة
  • طرق المثيل المتزامنة
  • كتلة متزامنة داخل طرق ثابتة
  • كتلة متزامنة داخل طرق المثيل

دعونا نلقي نظرة على كل طريقة من طرق مزامنة Java بمزيد من التفصيل.

طرق ثابتة متزامنة

هنا ، نستخدم الكلمة الأساسية المتزامنة لتمييز الطرق الثابتة في Java. فيما يلي مثال على طريقة Java ثابتة متزامنة:

برنامج MyStaticCounter الثابت العام {

عدد صحيح ثابت خاص = 0 ؛

زيادة باطلة متزامنة ثابتة عامة (قيمة int) {

العد + = القيمة ؛

}

}

طرق المثيل المتزامنة

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

فئة عامة MyCounter {

عدد العمليات الخاصة = 0 ؛

الزيادة العامة الباطلة المتزامنة (قيمة int) {

this.count + = value؛

}

إنقاص الفراغ المتزامن العام (قيمة int) {

this.count - = القيمة ؛

}

}

كتلة متزامنة داخل طرق ثابتة

يوجد أدناه مثال حيث نستخدم كتلة متزامنة داخل طريقة ثابتة:

فئة عامة MyClass {

طباعة باطلة ثابتة عامة (رسالة سلسلة) {

متزامن (MyClass.class) {

log.writeln (رسالة) ؛

}

}

}

كتلة متزامنة داخل طرق المثيل

بدلاً من مزامنة الطريقة بأكملها ، يمكننا استخدام المزامنة على كتلة معينة داخل الطريقة. فيما يلي مثال على كتلة متزامنة من التعليمات البرمجية داخل طريقة غير متزامنة:

زيادة الفراغ العام (قيمة int) {

متزامن (هذا) {

this.count + = value؛

}

}

الحاجة إلى التزامن في جافا

الآن بعد أن عرفت ما هي المزامنة في Java ، قد تتساءل عن سبب استخدامها في المقام الأول.

توفر الكلمة الأساسية المتزامنة لـ Java وظائف أساسية للبرمجة المتزامنة. إليك كيف تساعد المزامنة في Java:

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

استنتاج

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

أتساءل أين تتعلم جافا؟

شهادة PG المرتبطة بالوظيفة من upGrad في هندسة البرمجيات هو ما تبحث عنه!

مصممة خصيصًا للخريجين الجدد والسنوات الأخيرة ، تعتبر شهادة PG المرتبطة بالوظيفة في هندسة البرمجيات من upGrad مثالية لأولئك الذين يرغبون في تعلم البرمجة والحصول على وظائف برمجية للمبتدئين. سيقوم هذا البرنامج عبر الإنترنت لمدة 5 أشهر بتعليم أفضل مهارات البرمجيات مثل Java و JavaScript و HTML5 و DSA و AWS و MERN والمزيد!

س: لماذا نستخدم المزامنة في Java؟

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

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

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

س: ما هو الجمود في جافا؟

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