في Java ، يتم استخدام الكلمة الرئيسية المتزامنة وقفل القفل لتحقيق التحكم المتزامن في الوصول إلى الموارد. يُسمح فقط لخيوط الفريدة بالدخول إلى المنطقة الحرجة للوصول إلى الموارد (باستثناء أقفال القراءة). الغرض الرئيسي من هذا السيطرة الفرعية هو حل مشكلة عدم تناسق البيانات الناتجة عن مؤشرات ترابط متعددة بشكل متزامن مع نفس المورد. في سيناريو آخر ، يحتوي المورد على نسخ متعددة للاستخدام في نفس الوقت ، مثل الطابعات المتعددة في غرفة الطابعة ، وحفر متعددة للاستخدام في نفس الوقت. في هذه الحالة ، توفر Java تحكمًا متزامنًا في الوصول - التحكم المتزامن في الوصول إلى نسخ متعددة من المورد ، والرملة المستخدمة اليوم هي واحدة منها.
يمكن لـ Java اكتشاف مشاكل سلامة الخيوط المحتملة في نظامنا بأسرع طريقة من خلال محاكاة التعليمات البرمجية. هنا ، يتم استخدام Semaphore (Semaphore) و CountDownlatch (Locking) مع ExecutorService (تجمع الخيوط) للمحاكاة. المقدمة الرئيسية هي على النحو التالي:
1
سيتم توفير هذا الفصل بعد JDK 1.5
Semaphore هو Semaphore القائم على العد. يمكن أن تضع عتبة ، بناءً على ذلك ، تتنافس مؤشرات الترابط المتعددة للحصول على إشارة الترخيص ، وإعادتها بعد تقديم طلبها الخاص. بعد تجاوز العتبة ، سيتم حظر تطبيق مؤشر الترابط لإشارة الترخيص. يمكن استخدام Semaphore لإنشاء بعض تجمعات الكائنات ، ومجمعات الموارد ، وما إلى ذلك ، مثل تجمعات اتصال قاعدة البيانات. يمكننا أيضًا إنشاء Semaphore مع عدد 1 ، باستخدامه كآلية مماثلة لأقفال Mutex. وهذا ما يسمى أيضا semaphore الثنائي ، يشير إلى حالتين mutex.
2. العد التنازلي
سيتم توفير هذا الفصل بعد JDK 1.5.
يمكن لفئة CountDownlatch أن تجعل مؤشر ترابط انتظر حتى يتكمل مؤشرات الترابط الأخرى عملها قبل التنفيذ. على سبيل المثال ، يريد مؤشر الترابط الرئيسي للتطبيق تنفيذه بعد أن بدأ مؤشر الترابط المسؤول عن بدء خدمة الإطار جميع الخدمات الإطارية.
يتم تنفيذ CountDownlatch من خلال عداد ، والقيمة الأولية للعداد هي عدد مؤشرات الترابط. عندما يكمل مؤشر ترابط مهمته الخاصة ، يتم تقليل قيمة العداد بمقدار 1. عندما تصل قيمة العداد إلى 0 ، فإن ذلك يعني أن جميع مؤشرات الترابط قد أكملت المهمة ، ثم يمكن لخيوط تنتظر القفل استئناف تنفيذ المهمة.
كما هو مبين في الشكل أدناه:
يمكن استخدام الفئتين أعلاه مجتمعين لتحقيق تأثير محاكاة التزامن العالي. يتم استخدام الرمز التالي لإعطاء مثال:
وحدات الحزمة ؛ استيراد java.util.concurrent.countdownlatch ؛ استيراد java.util.concurrent.executorservice ؛ استيراد java.util.concurrent.executors ؛ استيراد java.util.concurrent.semaphore ؛ public countexample // عدد المواضيع التي تم تنفيذها بشكل متزامن في نفس الوقت static int static static = 200 ؛ العد الثابت العام = 0 ؛ Public Static Void Main (String [] args) يلقي الاستثناء {executorService ExecutorService = eventors.newcachedthreadpool () ؛ // semiconductor ، يستخدم للتحكم في عدد المواضيع المتزامنة هنا semaphore semaphore النهائي = semaphore جديد (threadtotal) ؛ // locking ، والتي يمكن أن تدرك انخفاض في countdownlatch countdownlatch النهائي count لـ (int i = 0 ؛ i <clienttotal ؛ i ++) {executorService.execute (() -> {try {// تنفيذ هذه الطريقة للحصول على إذن التنفيذ. عند عدم تجاوز العدد الإجمالي للترخيص غير المصدر 200 ، Catch (استثناء e) {//log.error("Exception "، e) ؛ } countDownlatch.await () ؛ // blocks thread ، ولا يتم إصدار الكتلة حتى تكون قيمة القفل 0. تابع تنفيذ ExecutorService.shutdown () ؛ log.info ("count: {}" ، count) ؛ } private static void add () {count ++ ؛ }}كما هو موضح في الطريقة أعلاه ، يتم محاكاة 5000 طلب ، و 200 عملية متزامنة تصل إلى 200 عملية متزامنة في نفس الوقت. لاحظ النتائج النهائية وتجد أن النتائج مختلفة في كل مرة ولا تتفق مع التوقعات. النتيجة على النحو التالي:
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 4997
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MONIDES.COUNTEXAMPLE - COUNT: 4995
22: 18: 26.449 [main] info modules.countexample - count: 4998
الاستنتاج النهائي: طريقة الإضافة ليست آمنة مؤشر ترابط
ثم كيفية التأكد من سلامة مؤشر ترابط طريقة إضافة ، قم بتعديل طريقة إضافة على النحو التالي:
void static add () {count.incrementandget () ؛}نتائج التنفيذ هي كما يلي:
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
22: 18: 26.449 [MAIN] MODULES.COUNTEXAMPLE - COUNT: 5000
الاستنتاج النهائي: Added Add Method Safe-Safe-Safe-Safe
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.