توضح هذه المقالة بشكل أساسي سيناريو معالجة Java Programming متعددة الخيوط من خلال مثال على مستخدمي البنوك الذين يسحبون الأموال ، على النحو التالي.
ابدأ بمثال: قم بتنفيذ رمز المثال لسيناريو حساب الحساب المصرفي.
الدرجة الأولى: account.java
فئة الحساب:
حزمة cn.edu.byr.test ؛ حساب الفئة العامة {private string accountno ؛ رصيد مزدوج خاص ؛ حساب عام () {} حساب عام (string accountno ، رصيد مزدوج) {this.Accountno = accountno ؛ this.balance = palance ؛ getBalance () {return this.balance ؛} public void setbalance (double balance) {this.balance = balance ؛} المساواة بين المنطقية العامة (الكائن obj) {if (this == obj) return true ؛ if (obj! = null && obj.getClass () == account.class) خطأ شنيع؛}} الدرجة الثانية: dermthread.java
فئة موضوع سحب الأموال:
Package Cn.edu.byr.test ؛ requread من الفئة العامة يمتد الموضوع {حساب خاص ؛ private drawamount ؛ public drawThread (اسم السلسلة ، حساب ، double drawamount) {super (name) ؛ this.account = account ؛ DrawAmount) {system.out.println (getName () + "احصل على المال بنجاح ، ابصق الأوراق النقدية:" + drawamount) ؛ // حاول {// thread.sleep (1) ؛ //} // catch (interruptedException e) {// e.printstacktrace () ؛ //} حساب. system.out.println ("/t الرصيد هو:" + حساب. DRIPTHREAD ("A" ، acct ، 800) .start () ؛ New DraftHread ("B" ، ACCT ، 800) .start () ؛}} الجزء الذي تم التعليق عليه في الكود أعلاه: (1) كتلة رمز المزامنة المتزامنة (2) الإسبات. إذا كان (1) و (2) ، فهناك العديد من الاحتمالات لنتيجة التشغيل ، أحد الاحتمالات (الاحتمال صغير) ، والذي يتوافق مع المنطق الطبيعي:
B يسحب الأموال بنجاح ، يبصق المال: 800.0
التوازن هو: 200.0
كان الانسحاب الفاشل ولم يكن التوازن كافيًا!
يجب أن يكون B أولاً يجد مورد سحب الأموال ويعدل الرصيد بشكل صحيح قبل بدء الحكم على رصيد المستخدم ؛ هذا الاحتمال صغير جدًا ، وستكون معظم العمليات مشابهة للمواقف التالية:
يقوم A بنجاح بسحب المال ويبصق الأموال: 800.0
B يسحب الأموال بنجاح ، يبصق المال: 800.0
التوازن هو: -600.0
التوازن هو: 200.0
من الواضح أن هذا غير منطقي. من نتائج التشغيل ، يمكننا أن نخمن أن A أولاً يستولي على المورد وسحب المبلغ ، ولكن قبل تعديل الرصيد ، يتم الاستيلاء على المورد بواسطة B ؛ نظرًا لعدم تعديل الرصيد ، يرى B أن الرصيد لا يزال 800 ، ولا يزال B يسحب المبلغ ؛ يقوم الأول بتشغيل رصيد التعديل ، لكنه لا يطبعه ، B ينتزع المورد ؛ B يعدل التوازن ويطبع الرصيد ، وهو -600 ؛ يطبع التوازن ، وهو 200 ؛
إذا كان (2) ينام الخيط ، فيجب أن يكون حالة خطأ ، لأن A أو B ستصدر موارد وحدة المعالجة المركزية بسبب النوم بعد جلب المبلغ ، وسيقوم JVM بتسمية عمليات أخرى في الحالة الجاهزة. الشيء الثاني هو سحب الأموال والحكم على الرصيد يجب أن يكون خطأ.
إذا تمت إضافة (1) تم إضافة كتلة رمز متزامن متزامن ، يتم قفل الحساب في هيكل طريقة تشغيل الخيط ؛ ثم سيتم ضمان منطق التنفيذ ليكون طبيعيًا في كل مرة:
يقوم A بنجاح بسحب المال ويبصق الأموال: 800.0
التوازن هو: 200.0
فشل ب في سحب الأموال ، وكان الرصيد غير كافٍ!
يمكنك أن تتخيل عملية التنفيذ:
يستبق المورد أولاً ويغلق فئة الحساب في البداية في هيئة التشغيل ؛ ثم يبدأ في تنفيذ كتلة الكود المتزامن ؛ إذا تم تنفيذها على رابط معين في الوسط ، يتم استباق مورد وحدة المعالجة المركزية بواسطة B ؛ B يبدأ في التنفيذ ، ويغلق فئة الحساب في البداية. ومع ذلك ، عند إضافة قفل ، ستجد أن الحساب قد تم احتلاله بواسطة A ، وسيتم تعديله على حالة حظر وانتظار إصدار المورد ؛ بعد تنفيذ A كتلة التعليمات البرمجية المتزامنة ، سيتم إصدار قفل الحساب ، وسيستمر B في التنفيذ ؛ يتم ضمان تعديل الرصيد الذي شوهد أثناء التشغيل B بواسطة A وسيتم تنفيذه بشكل طبيعي وفقًا للمنطق الصحيح.
لخص
ما سبق هو كل محتوى هذه المقالة حول تحليل مثيلات المعالجة المتزامنة متعددة الخيوط لبرمجة Java ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!