Java Multithreading - كتل متزامنة
يتم استخدام كتلة Java Synchronized لتمييز الطريقة أو كتلة التعليمات البرمجية التي تتم مزامنتها. تستخدم كتل مزامنة Java لتجنب المنافسة. تقدم هذه المقالة المحتوى التالي:
كلمات رئيسية متزامنة Java (متزامنة)
يتم تزامن كتل متزامنة في Java. تتم مزامنة كتل المزامنة على كائن في Java. لا يمكن إدخال جميع كتل المزامنة المزامنة على كائن إلا بواسطة مؤشر ترابط واحد وتنفيذ عمليات في نفس الوقت. سيتم حظر جميع المواضيع الأخرى التي تنتظر الدخول إلى كتلة التزامن حتى يتم تنفيذ مؤشرات الترابط في كتلة التزامن.
هناك أربع كتل تزامن مختلفة:
تتم مزامنة جميع كتل المزامنة أعلاه على كائنات مختلفة. أي كتلة المزامنة مطلوبة فعليًا تعتمد على الموقف المحدد.
مثيل تزامن طريقة
فيما يلي طريقة مثال متزامنة:
void المزامنة العامة ADD (int value) {this.count += value ؛ }
تزامن الطريقة الثابتة
تزامن الطريقة الثابتة هو نفس طريقة مزامنة طريقة المثيل ، ويتم استخدام الكلمة الرئيسية المتزامنة أيضًا. تزامن طريقة جافا الثابتة على النحو التالي:
الفراغ المتزامن العام الثابت ADD (القيمة int) {count += value ؛ }وبالمثل ، تخبر الكلمة الرئيسية المتزامنة هنا Java أن هذه الطريقة متزامنة.
يشير مزامنة الطرق الثابتة إلى التزامن على كائن الفئة حيث توجد الطريقة. نظرًا لأن الفئة يمكن أن تتوافق مع كائن فئة واحد فقط في جهاز Java Virtual ، يُسمح فقط لخيط واحد بتنفيذ طرق المزامنة الثابتة في نفس الفئة.
لطرق التزامن الثابت في فئات مختلفة ، يمكن لخيط تنفيذ طرق التزامن الثابت في كل فئة دون انتظار. بغض النظر عن طريقة التزامن الثابت في الفصل الذي يتم استدعاؤه ، لا يمكن تنفيذ الفصل إلا بواسطة مؤشر ترابط واحد في نفس الوقت.
كتل متزامنة في أساليب المثال
في بعض الأحيان لا تحتاج إلى مزامنة الطريقة بأكملها ، ولكن بدلاً من ذلك تزامن جزء من الطريقة. يمكن لـ Java مزامنة جزء من الطريقة.
يرد أدناه مثال على كتلة التزامن في طريقة Java غير المتزامنة أدناه:
void public add (int value) {synchronized (this) {this.count += value ؛ }}أمثلة تستخدم مُنشئ كتلة Java المتزامن لتمييز قطعة من الكود المتزامن. هذا الرمز هو نفسه طريقة التزامن عند تنفيذها.
لاحظ أن مُنشئ كتلة Java المتزامن يربط الكائن بين قوسين. في المثال أعلاه ، يتم استخدام "هذا" ، أي المثيل نفسه الذي يستدعي طريقة إضافة. تسمى الكائنات المرفقة بين قوسين في مُنشئ المزامنة كائنات الشاشة. يستخدم الكود أعلاه مزامنة كائن الشاشة ، وتستخدم طريقة المثيل المتزامن مثيل طريقة الاتصال نفسها ككائن الشاشة.
يمكن تنفيذ مؤشر ترابط واحد فقط في طرق Java المزامنة مع نفس كائن الشاشة في وقت واحد.
يزامن الأمثلان التاليان كائن المثيل اللذين يسمونه ، بحيث يكونا مكافئين في تأثير التنفيذ المتزامن.
الفئة العامة myClass {public synchronized void log1 (String msg1 ، string msg2) {log.writeln (msg1) ؛ log.writeln (msg2) ؛ } public void log2 (String msg1 ، string msg2) {synchronized (this) {log.writeln (msg1) ؛ log.writeln (msg2) ؛ }}}في المثال أعلاه ، يمكن تنفيذ مؤشر ترابط واحد فقط في أي من كتل التزامن في وقت واحد.
إذا لم يتم مزامنة كتلة التزامن الثانية على كائن المثيل هذا ، فيمكن تنفيذ الطريقتين في وقت واحد بواسطة مؤشر الترابط.
كتل متزامنة في الطرق الثابتة
على غرار ما سبق ، فيما يلي أمثلة على تزامن طريقتان ثابتتين. تتم مزامنة هذه الطرق على كائن الفئة الذي تنتمي إليه الطريقة.
الفئة العامة myClass {public static synchronized void log1 (String msg1 ، string msg2) {log.writeln (msg1) ؛ log.writeln (msg2) ؛ } public static void log2 (String msg1 ، string msg2) {synchronized (myclass.class) {log.writeln (msg1) ؛ log.writeln (msg2) ؛ }}}لا تسمح هاتان الطريقتان بالوصول بواسطة المواضيع في نفس الوقت.
إذا لم يتم مزامنة كتلة المزامنة الثانية على كائن myClass.class. ثم يمكن الوصول إلى هاتين الطريقتين بواسطة مؤشرات الترابط في نفس الوقت.
مثيل مزامنة Java
في المثال التالي ، يتم بدء تشغيل مؤشر ترابط ، كلاهما يدعو طريقة إضافة نفس المثيل من فئة العداد. نظرًا لأن التزامن موجود على المثيل الذي تنتمي إليه الطريقة ، يمكن لخيط واحد فقط الوصول إلى الطريقة في نفس الوقت.
عداد الفئة العامة {العد الطويل = 0 ؛ void المتزامن العام إضافة (قيمة طويلة) {this.count += value ؛ }} الفئة العامة counterThread يمتد مؤشر الترابط {عداد محمي = null ؛ مضاد عام (عداد العداد) {this.count = counter ؛ } public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {counter.add (i) ؛ }}} مثال الفئة العامة {public static void main (string [] args) {counter counter = new counter () ؛ threada threada = counterThread (counter) ؛ Thread ThreadB = جديد مضاد (عداد) ؛ threada.start () ؛ threadb.start () ؛ }}تم إنشاء خيطين. يشير مُنشئهم إلى نفس مثيل العداد. تتم مزامنة طريقة Counter.ADD على مثيل لأن طريقة إضافة طريقة مثيل وتتميز بالكلمة الرئيسية المتزامنة. لذلك ، يُسمح لخيط واحد فقط بالاتصال بالطريقة في وقت واحد. يجب أن ينتظر مؤشر ترابط آخر حتى يخرج الخيط الأول من طريقة ADD () قبل الاستمرار في تنفيذ الطريقة.
إذا كان خيوطان يشيران إلى حالتين مضادتين مختلفتين ، فيمكنهم استدعاء طريقة Add () في نفس الوقت. هذه الطرق تسمي كائنات مختلفة ، بحيث تتم مزامنة هذه الطرق على كائنات مختلفة. لن يتم حظر مكالمات الطريقة هذه. كما هو موضح في المثال التالي:
مثال من الفئة العامة {public static void main (string [] args) {counter countera = new Counter () ؛ Counter CounterB = New Counter () ؛ threada threada = counterThread (countera) ؛ Thread ThreadB = جديد مضاد (counterb) ؛ threada.start () ؛ threadb.start () ؛ }}لاحظ أن هذين الموضوعين ، Threada و Threadb ، لم يعد يشير إلى نفس مثيل العداد. تتم مزامنة أساليب إضافة مضاد ومكافحة على الكائن الذي ينتمون إليه. لن يؤدي استدعاء طريقة إضافة Countera إلى منع المكالمة إلى طريقة إضافة CounterB.
ما سبق هو شرح لمعرفة كتل المزامنة متعددة الخيوط Java. سنستمر في إضافة المعلومات ذات الصلة في المستقبل. شكرا لك على دعمك لهذا الموقع!