تمثل الكلمة الرئيسية المتزامنة أن هذه الطريقة مغلقة. يعادل أي مؤشر ترابط (مثل الموضوع أ) ، عند تشغيل هذه الطريقة ، يجب عليك التحقق مما إذا كانت مؤشرات الترابط الأخرى B (أو C ، D ، إلخ) تستخدم هذه الطريقة (أو طرق التزامن الأخرى في هذه الفئة). إذا كان الأمر كذلك ، فانتظر مؤشر الترابط B (أو C ، D) الذي يستخدم الطريقة المتزامنة لتشغيل هذه الطريقة قبل تشغيل هذه الطريقة. إذا لم يكن كذلك ، قفل المتصل وقم بتشغيله مباشرة. ويشمل استخدامين: الطريقة المتزامنة والكتلة المتزامنة.
تقوم آلية التزامن متعددة الخيوط بإغلاق الموارد بحيث في نفس الوقت ، يمكن تشغيل مؤشر ترابط واحد فقط ، ويتم استخدام المزامنة لحل المشكلات التي قد تنشأ عند الوصول إلى مؤشرات الترابط المتعددة في وقت واحد.
يمكن تنفيذ آلية التزامن باستخدام الكلمة الرئيسية المتزامنة.
عندما تعدل الكلمة الرئيسية المتزامنة طريقة ، تسمى الطريقة طريقة التزامن.
عند تنفيذ الطريقة المتزامنة أو حدوث استثناء ، سيتم إصدار القفل تلقائيًا.
فيما يلي مثال لتحليل استخدام الكلمات الرئيسية المتزامنة.
1. استخدام الكلمات الرئيسية المتزامنة
مثال البرنامج 1
الفئة العامة threadtestest {public static void main (string [] args) {example example = new example () ؛ الموضوع T1 = Thread1 جديد (مثال) ؛ الموضوع T2 = new thread1 (مثال) ؛ t1.start () ؛ t2.start () ؛ }} مثال {public synchronized void execute () {for (int i = 0 ؛ i <10 ؛ ++ i) {try {thread.sleep (500) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("Hello:" + i) ؛ }}} class thread1 يمتد مؤشر الترابط {مثال خاص ؛ public thread1 (مثال على سبيل المثال) {this.example = example ؛ } Override public void run () {example.execute () ؛ }} سواء كنت يجب تقديم الكلمة الرئيسية المتزامنة في طريقة Execute () ، ستكون نتائج تنفيذ برنامج المثال مختلفًا تمامًا.
إذا لم تتم إضافة الكلمة الرئيسية المتزامنة ، فإن الخيطين يقومان بتنفيذ طريقة التنفيذ () في نفس الوقت ، والإخراج هو مجموعتان من المتزامنين.
إذا تمت إضافة الكلمة الرئيسية المتزامنة ، فسيتم إخراج مجموعة من 0 إلى 9 أولاً ، وبعد ذلك سيتم إخراج المجموعة التالية ، مما يشير إلى أن الخيطين يتم تنفيذها بالتسلسل.
2. الوضع متعدد الخيوط لطرق متعددة
قم بتغيير البرنامج وأضف طريقة أخرى تنفيذ 2 () إلى فئة المثال.
ثم اكتب Thread Class Thread2. طريقة Run () في Thread2 تنفيذ execute2 (). يتم تعديل كلتا الطريقتين في فئة المثال بواسطة الكلمة الرئيسية المتزامنة.
مثال البرنامج 2
الفئة العامة threadtestest {public static void main (string [] args) {example example = new example () ؛ الموضوع T1 = Thread1 جديد (مثال) ؛ الموضوع T2 = Thread2 جديد (مثال) ؛ t1.start () ؛ t2.start () ؛ }} example {public synchronized void execute () {for (int i = 0 ؛ i <20 ؛ ++ i) {try {thread.sleep ((long) math.random () * 1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("Hello:" + i) ؛ }} public synchronized void execute2 () {for (int i = 0 ؛ i <20 ؛ ++ i) {try {thread.sleep ((long) math.random () * 1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("World:" + i) ؛ }}} class thread1 يمتد مؤشر الترابط {مثال خاص ؛ public thread1 (مثال على سبيل المثال) {this.example = example ؛ } Override public void run () {example.execute () ؛ }} class thread2 يمتد مؤشر الترابط {مثال خاص ؛ public thread2 (مثال مثال) {this.example = example ؛ } Override public void run () {example.execute2 () ؛ }} إذا تمت إزالة الكلمة الرئيسية المتزامنة ، فسيتم تنفيذ الطريقتين بشكل متزامن وليس لهما تأثير متبادل.
ولكن كما هو مكتوب في المثال الفرعي ، حتى طريقتين:
نتيجة التنفيذ هي دائمًا إخراج مؤشر ترابط واحد ثم تنفيذ مؤشر ترابط آخر.
يوضح:
إذا كان للكائن طرقًا متعددة متزامنة ، وأدخل مؤشر ترابط طريقة متزامنة في لحظة معينة ، فلن تتمكن مؤشرات الترابط الأخرى من الوصول إلى أي طرق متزامنة للكائن قبل تنفيذ الطريقة.
ختاماً:
عندما تعدل الكلمة الرئيسية المتزامنة طريقة ، تسمى الطريقة طريقة التزامن.
كل كائن في جافا لديه قفل ، أو شاشة. عندما يصل مؤشر ترابط إلى الطريقة المتزامنة لكائن ما ، يتم قفل الكائن ، ولا يمكن لأي مؤشر ترابط آخر الوصول إلى الطريقة المتزامنة للكائن (هنا يشير إلى جميع طرق المزامنة ، وليس فقط الطريقة نفسها). لن يتم ذلك حتى يكمل مؤشر الترابط السابق طريقة التنفيذ (أو يلقي استثناءً) ، حيث يتم إصدار قفل الكائن ، بحيث يمكن لخيوط أخرى الوصول إلى الطريقة المتزامنة للكائن مرة أخرى.
لاحظ أن الكائن مغلق في هذا الوقت. إذا كان كائنًا مختلفًا ، فلا توجد علاقة قيود بين الكائنات.
عند محاولة إنشاء كائن مؤشر ترابط ثانٍ في الكود ، يتم تمرير كائن مثال جديد ، ثم لا يوجد أي قيود بين تنفيذ المواضيع.
3. النظر في طرق التزامن الثابت
عندما يتم تعديل طريقة تعديل الكلمة الرئيسية المتزامنة أيضًا بواسطة ثابت ، فقد قيل من قبل أن طريقة المزامنة غير الستائية ستقفل الكائن ، لكن الطريقة الثابتة لا تنتمي إلى الكائن ، بل فئة ، وستغلق كائن الفئة من الفئة حيث توجد هذه الطريقة.
بغض النظر عن عدد الكائنات التي ينشئها فئة ، فإنها تتوافق مع نفس كائن الفئة.
مثال البرنامج 3
الفئة العامة threadtestest {public static void main (string [] args) {example example = new example () ؛ الموضوع T1 = Thread1 جديد (مثال) ؛ // حتى إذا تم تمرير كائنات مختلفة هنا ، فإن تزامن الطريقة الثابتة لا يزال لا يسمح بتنفيذ مؤشرات ترابط متعددة في نفس الوقت. مثال = مثال جديد () ؛ الموضوع T2 = Thread2 جديد (مثال) ؛ t1.start () ؛ t2.start () ؛ }} example {public synchronized static void execute () {for (int i = 0 ؛ i <20 ؛ ++ i) {try {thread.sleep ((long) math.random () * 1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("Hello:" + i) ؛ }} execute2 () {for (int i = 0 ؛ i <20 ؛ ++ i) {try {thread.sleep ((long) math.random () * 1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("World:" + i) ؛ }}} class thread1 يمتد مؤشر الترابط {مثال خاص ؛ public thread1 (مثال على سبيل المثال) {this.example = example ؛ } Override public void run () {example.execute () ؛ }} class thread2 يمتد مؤشر الترابط {مثال خاص ؛ public thread2 (مثال مثال) {this.example = example ؛ } Override public void run () {example.execute2 () ؛ }} لذلك إذا كانت طريقة ثابتة (تنفيذ () وتنفيذ 2 () ، تمت إضافة كلمات رئيسية ثابتة) ، حتى لو تم تمرير كائنات مثال مختلفة إلى مؤشر ترابط ، لا يزال هناك مؤشر ترابط مقيدين من قبل بعضهما البعض. يجب تنفيذ المرء أولاً ثم واحد التالي.
ختاماً:
إذا كانت طريقة متزامنة ثابتة ، عندما يصل مؤشر ترابط إلى الطريقة ، فإنه لا يغلق الكائن الذي توجد فيه الطريقة المتزامنة ، ولكن كائن الفئة المقابل للفئة حيث توجد الطريقة المتزامنة. في Java ، بغض النظر عن عدد الكائنات التي لدى الفئة ، ستتوافق هذه الكائنات مع كائن فئة فريد. لذلك ، عندما يصل مؤشر ترابط إلى طريقتين ثابتتين ومتوازنة لكائنين من نفس الفئة ، يكون ترتيب التنفيذ الخاص بهما متسلسلًا أيضًا ، أي أن سلسلة رسائل واحدة تنفذ الطريقة أولاً ، ويبدأ مؤشر الترابط الآخر بعد اكتمال التنفيذ.
4. كتلة متزامنة
طريقة كتابة الكتلة المتزامنة:
متزامن (كائن) {} وهذا يعني أن مؤشر الترابط سيغلق كائن الكائن عند تنفيذه. (لاحظ أن هذا الكائن يمكن أن يكون كائنًا لأي فئة ، أو يمكنك استخدام هذه الكلمة الرئيسية).
بهذه الطريقة ، يمكنك تحديد الكائن المقفل بنفسك.
مثال البرنامج 4
الفئة العامة threadtestest {public static void main (string [] args) {example example = new example () ؛ الموضوع T1 = Thread1 جديد (مثال) ؛ الموضوع T2 = Thread2 جديد (مثال) ؛ t1.start () ؛ t2.start () ؛ }} class example {private object = new Object () ؛ public void execute () {synchronized (object) {for (int i = 0 ؛ i <20 ؛ ++ i) {try {thread.sleep ((long) math.random () * 1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("Hello:" + i) ؛ }}} public void execute2 () {synchronized (object) {for (int i = 0 ؛ i <20 ؛ ++ i) {try {thread.sleep ((long) math.random () * 1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("World:" + i) ؛ }}}}} Class Thread1 يمتد مؤشر الترابط {مثال خاص ؛ public thread1 (مثال على سبيل المثال) {this.example = example ؛ } Override public void run () {example.execute () ؛ }} class thread2 يمتد مؤشر الترابط {مثال خاص ؛ public thread2 (مثال مثال) {this.example = example ؛ } Override public void run () {example.execute2 () ؛ }} التأثير الذي تم تحقيقه عن طريق البرنامج 4 هو نفس برنامج المثال 2. يتم تنفيذ كلا الموضوعين بالتسلسل ، وليس بشكل متزامن. عندما يتم تنفيذ مؤشر ترابط واحد ، يتم قفل كائن الكائن ، ولا يمكن للمعلومات الأخرى تنفيذ الكتلة المقابلة.
الطريقة المتزامنة تعادل في الواقع لف جميع العبارات في الطريقة باستخدام كتلة متزامنة ، ثم تمرير هذه الكلمة الرئيسية في قوسين الكتلة المتزامنة. بالطبع ، إذا كانت طريقة ثابتة ، فيجب قفل كائن الفصل.
ربما ستشمل بضعة أسطر من التعليمات البرمجية في طريقة ما مشكلات مزامنة مؤشر الترابط ، وبالتالي فإن الكتلة المتزامنة تتحكم في الوصول إلى مؤشرات ترابط متعددة أكثر من الطريقة المتزامنة. لا يمكن الوصول إلى المحتوى في الكتلة المتزامنة فقط بواسطة مؤشرات ترابط متعددة في نفس الوقت ، ولا يزال من الممكن الوصول إلى عبارات أخرى في الطريقة بواسطة مؤشرات ترابط متعددة في نفس الوقت (بما في ذلك قبل وبعد الكتلة المتزامنة).
ملاحظة: يجب أن تكون البيانات المحمية بواسطة المزامنة خاصة.
ختاماً:
الطريقة المتزامنة هي تحكم متزامن الحبيبات الخشنة. في لحظة معينة ، يمكن لخيط واحد فقط تنفيذ الطريقة المتزامنة ؛
الكتلة المتزامنة هي عنصر تحكم في التزامن دقيق ، والذي يزامن فقط الرمز في الكتلة. يمكن الوصول إلى الرموز الأخرى الموجودة في الطريقة وبخلاف الكتل المتزامنة بواسطة مؤشرات ترابط متعددة في نفس الوقت.