عندما رأيت هذا السؤال لأول مرة ، لم أستطع البدء لأنني شعرت أن المزامنة والقفل كانت مختلفة تمامًا من حيث القفل. على سبيل المثال ، تعرف على كيفية القفل عند المزامنة في ظل الظروف العادية.
الطريقة 1:
void المتزامن العام A () {// todo}الطريقة 2:
public void b () {synchronized (this) {// todo}}من هاتين الطريقتين ، تتم إضافة القفل بين {}. دعونا نلقي نظرة على كيفية الانتهاء من القفل:
public void c () {lock.lock () ؛ حاول {// toDo} أخيرًا {lock.unlock () ؛ }}تتم إضافة طريقة القفل هذه بين Lock () و Unlock (). لذلك ، إذا كنت ترغب في تنفيذ وظيفة قفل ، فيجب عليك التفكير في كيفية تنفيذ هاتين الطريقتين ، وطرق القفل () وفتح () ، حدد أولاً إطارًا على النحو التالي:
قفل void العام () {} public void inlock () {}ثم عليك التفكير في كيفية استخدام المزامنة لتنفيذ هاتين الطريقتين.
الآن أنا أكثر وضوحًا في ذهني ، لكنني لا أعرف كيفية ملء هاتين الطريقتين. إليك كيفية تحليل خصائص قفل Lock ، ثم نلقي نظرة على هذا الرمز:
void public void c () {lock.lock () ؛ // عندما يحصل مؤشر الترابط الحالي على القفل ، يجب أن ينتظر مؤشر ترابط آخر تجربة {// thread thread in the lock ، لا يمكن أن يحصل مؤشر ترابط آخر على // toDo} أخيرًا {lock.unlock () ؛لقد أضفت للتو تعليقًا صغيرًا على هذا الرمز ولم أفعل شيئًا آخر. هل يساعد على فهم هذا الرمز ومعرفة ما هي الكلمة الأكثر شيوعًا ، CurrentThread؟ لذلك عندما نملأ أساليب القفل () ونفتح () ، هل يجب أن نولي اهتمامًا لتوضيح الكلمة الرئيسية الحالية للعثور على الحل؟ الجواب نعم.
ثم التحليل ، كيف تجعل الخيط ينتظر عند استخدام المزامنة؟ إنه لاستخدام طريقة Wait (). كيف تستيقظ الخيط؟ ويستخدم طريقة الإخطار (). ثم تحتاج إلى استخدام طريقة Wait () في طريقة Lock () وطريقة إخطار () في طريقة Unlock (). لذلك عندما نستخدم Wait () وعلم () ، لدينا شرط. فكر فيما يجب أن نستخدمه كشرط؟
يجب أن نستخدم ما إذا كان القفل الحالي مشغولًا كشرط للحكم. إذا كان القفل مشغولًا ، فانتظر CurrentThread. فكر فيما إذا كنا نستخدم هذا الشرط عند استخدام المزامنة. الجواب نعم.
دعنا نحلل متى نطلق القفل وما هي الشروط المستخدمة. فكر في ما إذا كان الموضوع A يحصل على القفل ، هل يمكن إصدار الموضوع B؟ بالطبع لا. إذا كان يمكن إطلاق B ، فإنه ينتهك المبدأ ، بالطبع لا. من المؤكد أنه لا يمكن إطلاق قفل الموضوع A إلا. لذلك ، فإن شرط الحكم هو الحكم على ما إذا كان الخيط الذي يحمل القفل هو الحالي. إذا كان الأمر كذلك ، فيمكن إصداره ، ولكن بالطبع لا يمكن.
لنلقي نظرة على الرمز الكامل الآن:
package test.lock ؛ import java.util.random ؛ import java.util.concurrent.executorservice ؛ import java.util.concurrent.executors ؛ import java.util.concurrent.ThreadFactory ؛ public class naivelock {private static long none = -1 ال Synchronized void lock () {long CurrentThreadId = thread.currentThread (). getId () ؛ if (owner == currentThreadId) {رمي جديد alualalstateException ("تم الحصول على قفل بواسطة مؤشر الترابط الحالي") ؛} بينما (this.isbooked ()) {wait () ؛} catch (interruptedException e) {E.PrintStackTrace () ؛}} owner = currentThreadId ؛ system.out.println (string.format ("تم الحصول على القفل من خلال الخيط ٪ s" ، المالك)) ؛} alfulalStateException ("يمكن لمالك القفل فقط إلغاء قفل القفل") ؛} system.out.println (string.format ("Thread ٪ S inflock" ، المالك)) ؛ system.out.println () eventors.NewFixedThreadPool (20 ، new threadfactory () {private threadgroup group = new threadgroup ("Test Thread Group") ؛ {group.setdaemon (true) ؛}@override public thread newThread (dennable r) {return new thread (group ، r) ؛}}) {Override public void run () {lock.lock () ؛ system.out.println (string.format ("thread ٪ s يتم تشغيل ..." ، thread.currentThread (). {E.PrintStackTrace () ؛} lock.unlock () ؛}}) ؛}}}قم بتشغيله وشاهد النتائج:
يتم الحصول على قفل بواسطة Thread 8 Thread 8 هو تشغيل ... موضوع 27 هو انتظار قفل الموضوع 26 هل انتظر قفل الموضوع 25 هل انتظر مؤشر ترابط 24 هل انتظر مؤشر الموضوع 23 هل انتظر مؤشر مؤشر 22 هل انتظر مؤشر قفل 21 هو انتظار قفل الموضوع 20 هل انتظر قفل 19 انتظار قفل الموضوع 18 27 مؤشر ترابط 27 قيد التشغيل ... يتم الحصول على مؤشر ترابط 27 هو فتح القفل بواسطة موضوع 26 مؤشر ترابط 26 هو تشغيل ... الموضوع 26 يتم الحصول على قفل القفل بواسطة الموضوع 25 الموضوع 25 هو تشغيل ... الموضوع 25 هو فتح قفل تم الحصول عليه بواسطة الموضوع 24 مؤشر الترابط 24 هو تشغيل ... الموضوع 24 هو إلغاء القفل. الموضوع 20 موضوع 20 هو تشغيل ... موضوع 20 هو فتح قفل تم الحصول عليه بواسطة الموضوع 19 مؤشر الترابط 19 هو تشغيل ... الموضوع 19 هو فتح قفل القفل من خلال الموضوع 18 هو تشغيل 18 حسب الموضوع 13 موضوع 13 هو تشغيل ... الموضوع 13 هو فتح قفل القفل بواسطة مؤشر الترابط 12 مؤشر الترابط 12 هو تشغيل ... الموضوع 12 هو فتح قفل القفل بواسطة الموضوع 11 مؤشر الترابط 11 هو تشغيل ... الموضوع 11 تم الحصول على قفل القفل من خلال الموضوع 10 موضوع 10 هو تشغيل ... الموضوع 10 تم الحصول على قفل القفل من خلال الموضوع 9
إذا قمت بتغيير الحلقة إلى 30 مرة ، انظر إلى النتائج:
يتم الحصول على قفل بواسطة Thread 8 Thread 8 هو تشغيل ... موضوع 27 هو انتظار قفل الموضوع 26 هل انتظر قفل الموضوع 25 هل انتظر مؤشر ترابط 24 هل انتظر مؤشر الموضوع 23 هل انتظر مؤشر مؤشر 22 هل انتظر مؤشر قفل 21 هو انتظار قفل الموضوع 20 هل انتظر قفل 19 انتظار قفل الموضوع 18 27 مؤشر ترابط 27 يعمل ... موضوع 8 هو انتظار قفل مؤشر مؤشر 27 هو فتح قفل القفل من خلال الموضوع 27 موضوع 27 هو تشغيل ... الموضوع 26 هل انتظر قفل مؤشر ترابط 27 هل يتم الحصول على قفل القفل من خلال الموضوع 27 موضوع 27 هو تشغيل ... الموضوع 25 هل انتظر قفل الموضوع 27 هل يتم الحصول على مؤشر ترابط القفل 22 ، يتم الحصول على قفل الإفتح بواسطة موضوع 22 مؤشر ترابط 22 22 هو تشغيل ... موضوع 21 هو انتظار قفل مؤشر 22 يتم الحصول على قفل القفل من خلال الموضوع 22 مؤشر الموضوع 22 هو تشغيل ... الموضوع 20 هو انتظار قفل مؤشر 22 هل يتم الحصول على قفل القفل. الموضوع 16 موضوع 16 هو تشغيل ... موضوع 16 هو فتح قفل القفل من خلال الموضوع 15 الخيط 15 هو تشغيل ... الموضوع 15 هو فتح قفل القفل من خلال الموضوع 14 الموضوع 14 هو تشغيل ... الموضوع 14 تم الحصول على قفل القفل من خلال الموضوع 13 الموضوع 13 هو تشغيل 13 هو الذي يتم الحصول عليه من قفل lefl هو unlized leved refluded بواسطة Thread 9 Thread 9 قيد التشغيل ... يتم الحصول على مؤشر الترابط 9 IS IS IS Unlocking بواسطة Thread 8 Thread 8 هو تشغيل ... يتم الحصول على مؤشر الترابط 8. يتم الحصول على مؤشر ترابط 21 مؤشر ترابط 21 ... يتم الحصول على مؤشر ترابط القفل من خلال مؤشر الترابط 20 ، الذي تم الحصول عليه من الموضوع 20 ... يتم الحصول على مؤشر الإلغاء عن قفل المراقب الذي تم فتحه بواسطة Thread 19 Thread 19.
لخص
ما سبق هو كل التفسير التفصيلي لهذه المقالة حول استخدام متزامن لتنفيذ رمز قفل. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
مثال رمز قفل مزامنة مؤشر ترابط Java
الفرق بين متزامن وقفل برمجة Java [الموصى به]
Java Multitheddered ReadWritelock رمز تنفيذ الفصل القراءة والكتابة
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!