يتماشى مزامنة مؤشر ترابط Java بشكل أساسي مع المنطق: إضافة قفل -------> تعديل --------> قفل إطلاق
1. مزامنة كتل الكود
الأمثلة على النحو التالي:
الفئة العامة SyncBlock {static class datawrap {int i ؛ } فئة ثابتة SyncBlockThread يمتد Thread {Private DataWrap Date ؛ SyncBlockThRead (DataWrap datawrap) {this.date = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {synchronized (date) {date.i ++ ؛ جرب {sleep (1) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println (getName () + "" + date.i) ؛ }}}} الفراغ الثابت العام (سلسلة [] args) {// متغير تنفيذ متعدد الخيوط ، أضيف إخراج واحد في تسلسل datawrap datawrap = جديد datawrap () ؛ syncblockthroad جديد (datawrap) .start () ؛ syncblockthroad جديد (datawrap) .start () ؛ syncblockthroad جديد (datawrap) .start () ؛ }}في المثال ، تريد إخراج الأعداد الصحيحة بالتسلسل.
عادةً ما تكون كتل التعليمات البرمجية المتزامنة كائنات تحتاج إلى قفل ، وهي موارد مشتركة بشكل عام تتطلب وصولًا متزامنًا. أي مؤشر ترابط يقوم أولاً بإغلاق المورد قبل تعديل المورد المحدد. خلال فترة القفل ، لا يمكن لخيوط أخرى تعديل المورد. هذا يضمن أمان المواضيع. بالإضافة إلى ذلك ، لن يتخلى الخيط عن قفل الموارد عند استدعاء النوم أو العائد.
2. طريقة التزامن
الفئة العامة syncmethod {static class datawrap {int i ؛ peried void valuegrow () {i ++ ؛ حاول {thread.sleep (1) ؛ } catch (interruptedException e) {// todo catch catch e.printstacktrace () ؛ } system.out.println (thread.currentThRead (). getName () + "" + i) ؛ }} فئة ثابتة syncmethodthread يمتد مؤشر الترابط {datawrap datawrap ؛ syncmethodthread العامة (datawrap datawrap) {this.datawrap = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {datawrap.valuegrow () ؛ }}} public static void main (string [] args) {// تنفيذ النمو المتسلسل والإخراج i datawrap datawrap = new datawrap () ؛ syncmethodthread جديد (datawrap) .start () ؛ syncmethodthread جديد (datawrap) .start () ؛ syncmethodthread جديد (datawrap) .start () ؛ }}طريقة التزامن هي طريقة تم تعديلها بواسطة الكلمة الرئيسية المتزامنة. طريقة التزامن تغلق الكائن نفسه. لذلك ، عندما يستدعي مؤشر ترابط طريقة التزامن لكائن معين ، إذا كانت مؤشرات الترابط الأخرى تسمي طرق المزامنة الأخرى للكائن ، فلا يزال يتعين عليهم الانتظار لإصدار قفل الكائن لأنه تم قفل الكائن.
3. قفل متزامن
يتم تحقيق التزامن عن طريق تحديد كائن قفل التزامن ، وفي هذه الحالة يستخدم قفل المزامنة كائن قفل للعمل على أنه.
استيراد java.util.concurrent.locks.lock ؛ استيراد java.util.concurrent.locks.reentrantlock ؛ synclock الفئة العامة {static class datawrap {lock lock = new reentrantlock () ؛ int أنا ؛ public void valuegrow () {lock.lock () ؛ حاول {i ++ ؛ حاول {thread.sleep (1) ؛ } catch (interruptedException e) {// todo catch catch e.printstacktrace () ؛ } system.out.println (thread.currentThRead (). getName () + "" + i) ؛ } أخيرًا {lock.unlock () ؛ }}} static class synclockThread يمتد مؤشر الترابط {datawrap datawrap ؛ synclockThRead العام (datawrap datawrap) {this.datawrap = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {datawrap.valuegrow () ؛ }}} public static void main (string [] args) {// تنفيذ النمو المتسلسل والإخراج i datawrap datawrap = new datawrap () ؛ SynclockThatRead جديد (DataWrap) .start () ؛ SynclockThatRead جديد (DataWrap) .start () ؛ SynclockThatRead جديد (DataWrap) .start () ؛ }}سيكون استخدام كائنات القفل لتنفيذ مزامنة مؤشر الترابط أكثر مرونة. تحتوي بعض الأقفال أيضًا على بعض الوظائف المحددة ، حيث من بينها القراءة القراءة والكتابة الأكثر شيوعًا ، ويمكن لإعادة الدخول إلى إعادة إدخال القفل.