فهم موجز للفرق بين العمليات والموضوعات في نظام التشغيل:
العملية: كل عملية لها رمز مستقل ومساحة بيانات (سياق العملية) ، وسيكون للتبديل بين العمليات العامة الكبيرة. تحتوي العملية على مؤشرات ترابط 1-N. (العملية هي أصغر وحدة لتخصيص الموارد)
الموضوع: نفس النوع من مؤشرات الترابط مشاركة الكود ومساحة البيانات. يحتوي كل مؤشر ترابط على مكدس تشغيل مستقل وبرنامج (PC) ، وتبديل مؤشر الترابط العلوي صغير. (الموضوع هو أصغر وحدة لجدولة وحدة المعالجة المركزية)
مثل العملية ، يتم تقسيم المواضيع إلى خمس مراحل: الخلق ، الجري ، الجري ، الحظر ، وإنهاء.
تعني العمليات المتعددة أن نظام التشغيل يمكنه تشغيل مهام متعددة (برامج) في نفس الوقت.
يشير Multithreading إلى تدفقات متسلسلة متعددة يتم تنفيذها في نفس البرنامج. بادئ ذي بدء ، يجب أن يكون تشغيل الأموال وسحب الأموال مرتبطة ، ويمكن أن يكون هناك العديد من العملاء. هذا يعني أنه يجب أن يكون هناك عدة مؤشرات ترابط ، وتشغيل مؤشرات ترابط متعددة بشكل مشترك للبنك ، ويجب مزامنة مبلغ البنك. فقط عن طريق ضمان سلامة الموضوع.
لذلك ، دعونا نضع هذا المثال لهذا الرمز هنا. إذا كان هناك شيء خاطئ ، فيرجى الإشارة إليه. لأن رجل عجوز سأل عن هذا الرمز متعدد الخيوط.
بادئ ذي بدء ، البنك ، إنشاء نموذج الكائن هذا.
Package com.lxk.ThreadTest.bank ؛/*** نموذج بنك ، سمة المبلغ الإجمالي. * <p> * * Author LXK في 2017/6/26 */بنك الفئة العامة {/** * أعط البنك رأس مال ناشئ ، وإلا كيف يمكنك ممارسة الأعمال التجارية. */private int sum = 200 ؛ // لا يتم استخدام هذا أبدًا مثل هذا ، لكنه أيضًا آلية قفل صحيحة: مزامنة كتل التعليمات البرمجية. // object obj = new Object () ؛ /*** وفر المال* إذا لم تضيف [وظيفة متزامنة-Sync] ، ستحدث مشاكل السلامة متعددة الخيوط. */void المزامنة العامة ADD (int n) {// synchronized (obj) {sum = sum + n ؛ try {thread.sleep (10) ؛} catch (استثناء تجاهل) {} // عندما يصبح عدد مرات توفير الأموال أكثر ، يمكنك العثور على أن مؤشرات ترابط الأموال المتوفرة تقومان بالفعل ببديل عن إجراء الحفظ. System.out.println (thread.currentThread (). getName () + "... sum =" + sum) ؛ //}}/*** سحب الأموال* إذا لم تضيف [وظيفة متزامنة-Sync] ، ستحدث مشاكل السلامة متعددة القراءة. */void المتزامن العام تقليل (int n) {if (sum - n> = 0) {sum = sum - n ؛} آخر {system.out.println ("أموال البنك ليست كافية!") ؛ توفير المال. system.out.println (thread.currentThread (). getName () + "... sum =" + sum) ؛}}هناك طريقتان في الكود: حفظ وجلب ، هاتين الطريقتين ، ومبلغ إجمالي ، وبعضها علقت الرمز. هذا بسيط وسهل الفهم ، وقفل متعدد الخيوط حصريًا ، ويضمن التزامن بين الخيوط.
ومع ذلك ، هذه طريقة نادرة. الطريقة الشائعة الاستخدام هي استخدام الكلمة الرئيسية المتزامنة لتعديل طريقة التزامن.
نموذج كائن العميل
package com.lxk.throadtest.bank ؛/*** عميل ، وتنفيذ واجهة RunNable () ، ويمكن للأشخاص المتعددين توفير المال معًا** Auuthor LXK في 2017/6/26*/public class عميل تنفذ Runnable {/**** apply*/static final type_add = البنك*/بنك البنك الخاص ؛/***نوع التشغيل من أجل المال أو الادخار أو السحب*/نوع السلسلة الخاصة ؛/***عدد العمليات من الناحية النظرية رقم إيجابي*/private int int ؛/***إلى أي مدى لتوفير أو سحب*/private int money ؛ {} العميل العام (bank bank ، time time ، int int) { Money ؛}@override public void run () {for (int x = 0 ؛ x <time ؛ x ++) {if (type_add.equals (type)) {bank.add (money) ؛} else if (type_reduce.equals (type)) {bank.reduce (mone) ؛}}}}}}}}}}}}}}ككائن عميل ، نظرًا لأن العديد من العملاء يمكنهم الوصول إلى أحد البنوك في نفس الوقت ، يتم تنفيذ تشغيل الأموال المتوفرة وسحبها باستخدام مؤشرات الترابط.
يتم إنشاء السمة لتمرير القيمة.
الطريقة الرئيسية
Package com.lxk.throadtest.bank ؛/** * مثيل متعدد الخيوط من الأموال المصرفية المصرفية * <p> * [المتطلبات:] * البنك لديه قبو. * هناك اثنين من المودعين الذين يودعون أو يسحبون n * 100 على التوالي. * الغرض: هل هناك أي مشكلة أمنية في هذا البرنامج؟ إذا كان الأمر كذلك ، كيف تحلها؟ * <p> * [كيفية العثور على المشكلة:] * 1. مسح الرموز التي هي رموز متعددة الخيوط. * 2. مشاركة البيانات بوضوح. * 3. قم بمسح العبارات في التعليمات البرمجية متعددة الخيوط تعمل على البيانات المشتركة. * * Author LXK في 2017/6/26 */الفئة العامة الرئيسية {public static void main (string [] args) {// One Bank and العديد من العملاء Bank Bank = New Bank () ؛ int time = 10000 ؛ int money = 100 ؛ // new العميل يوفر الأموال c1 = عميل جديد (bank ، customer.type_add ، time ، money) customer.type_reduce ، الوقت ، المال) ؛ الموضوع T1 = مؤشر ترابط جديد (C1) ؛ موضوع T2 = مؤشر ترابط جديد (C2) ؛ T1.Start () ؛ T2.start () ؛}}يظهر تأثير التشغيل الفعلي للرمز أعلاه في الشكل أدناه.
إذا كان عدد أوقات الإيداع وسحب المال صغيرًا ، فقد ترى أن الخيطين لهما تسلسل. لذلك ، لدينا عدد أكبر من المرات. ثم ، سنرى الموقف كما هو موضح في الشكل. يسحب الموضوع 1 الأموال ، وعندما يوفر الموضوع 0 المال ، يمكنك أن ترى أن الخيطين يتم تنفيذهان متداخلين ، مع كل من التخزين والسحب ، وليس هناك نمط.
هذا يضمن مزامنة البيانات.
أما بالنسبة لكيفية الخروج من التزامن ، أي ظاهرة غير طبيعية ،
يمكنك إزالة الكلمة الرئيسية المتزامنة لطريقة إضافة ، وتقليل عدد المرات وتغييرها إلى 3 مرات ، وتعيين القيمة الأولية للمبلغ إلى 0. جرب الرمز مرة أخرى ،
ستجد ما يسمى ظاهرة Async.
نتيجة التزامن خارج التزامن على الجانب الأيمن من الشكل أعلاه هو أن الشخصين يوفران 100 في كل مرة ، ثلاث مرات. هل تم الحصول على العدد الإجمالي؟ 100،200،300،400،500،600. يستغرق وقتا طويلا.
ومع ذلك ، فإن نتيجة العملية ليست
في هذا الوقت ، إذا قمت بإضافة متزامنة إلى طريقة إضافة ، ستظهر نتيجة الرسم البياني على اليسار ، وهي النتيجة الصحيحة.
أضفت طريقة أخرى من أجل الوجود والانسحاب. يصبح الرمز ما يبدو أعلاه.
هذه جميع الأمثلة تقريبا على التزامن بين الخيوط.
سوف أسجل الرمز لفترة وجيزة. عند استخدامها ، يمكنك إخراجها في دقائق.
لخص
ما ورد أعلاه هو الرمز الكامل لهذه المقالة حول محاكاة مشكلة التزامن متعددة التشققات في Java باستخدام سحب البنك كمثال. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
مثال برمجة Java Multithreded
مبدأ وتنفيذ توقيت Java Multithed
جافا تتفهم متعدد الخيوط عن طريق بيع التذاكر
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!