هذا هو الصحيح مبدأ الموضوع سيناريوهات المحلية وتطبيق

هذا هو الصحيح مبدأ الموضوع سيناريوهات المحلية وتطبيق

فهم صحيح وتطبيق مبادئ الموضوع المشهد المحلي

وتصف هذه الورقة الأمثلة المحلية الموضوع لمبادئ وأساليب التنفيذ، وتحليل السيناريوهات تطبيقه.

ThreadLocal حل أي مشاكل

منذ نموذج الدعم ThreadLocal، مثل ThreadLocal <  ب StringBuilder > ، لتسهيل العرض، مع وقت لاحق متغير ThreadLocal نيابة عن نفسها، ولكن مع أمثلة  الأمثلة النموذجية على أنواع محددة (على سبيل المثال StringBuidler) أ.

لم يفهم بشكل صحيح

سبب واحد لكتابة هذا المقال هو أن العديد من بلوق على الانترنت حول ThreadLocal سيناريوهات التطبيق وحل المشكلات، ووصف غير واضح، حتى خاطئة. وفيما يلي شائعة لإدخال ThreadLocal

ThreadLocal تقديم أفكار جديدة ThreadLocal غرض حل مشكلة برامج متعددة الخيوط المتزامنة هي مشكلة مشتركة لحل عندما مواضيع متعددة للوصول إلى الموارد

هناك العديد من المواد مقارنة أوجه الشبه والاختلاف في ThreadLocal وتزامن. وبما أنه للمقارنة، فإنه ينبغي النظر على حد سواء من أجل حل المشاكل واحدة أو متشابهة.

الوصف أعلاه، والمشكلة هي، ThreadLocal لا يحل متعددة الخيوط المشتركة  من المتغيرات. لأنه لا يشارك في متغير، فمن الكثير من مشاكل التزامن أقل.

الفهم الصحيح

ThreadLoal متغير، المبدأ الأساسي هو نفس الأشياء ThreadLocal الواردة في (على ThreadLocal <  سلسلة > وهذا هو، من حيث نوع متغير سلسلة)، وهناك نسخ مختلفة في مختلف الموضوع (في الواقع نسخة مختلفة، ويمكن وصفها في التفاصيل لاحقا). وفيما يلي بعض النقاط على المذكرة

  • بسبب نسخة خاصة بها من كل مثيل الموضوع، ونسخة يمكن استخدامها فقط من قبل الموضوع الحالي. وهذا أيضا هو أصل الاسم ThreadLocal
  • منذ لكل مثيل له نسخته الموضوع، الموضوع وغيرها لا يمكن الوصول إليها، فإنه سيتم تقاسمها بين المواضيع المتعددة لا توجد مشكلة
  • لا حصة، وكيفية مزامنة المشكلة، وكيفية حل مشكلة مزامنة مثلا؟

أن ThreadLocal في النهاية حل المشكلة، ولكن أيضا لنوع ما من المشهد؟

توفر هذه الفئة المتغيرات موضوع المحلي. هذه المتغيرات تختلف عن نظيراتها العادية في أن كل موضوع يصل واحد (عن طريق الحصول، أو طريقة مجموعة) لديها قناعاتها بأن تهيئة مستقل نسخة من المتغير. الحالات ThreadLocal حقول ثابت عادة خاصة في الطبقات التي ترغب في الدولة المنتسبين مع موضوع (على سبيل المثال، هوية المستخدم أو عملية ID) موضوع. كل يحمل إشارة ضمنية إلى نسخته من متغير موضوع المحلي طالما أن موضوع على قيد الحياة والمثال ThreadLocal يمكن الوصول إليه، بعد موضوع يذهب بعيدا، كل النسخ في حالات الخيط المحلية تخضع لجمع القمامة (ما لم توجد إشارات أخرى على هذه النسخ).

المعنى الأساسي

يوفر ThreadLocal الحالات الخيط المحلي. وهو يختلف عن المتغيرات العادية أن كل موضوع سوف تستخدم متغير التهيئة نسخة منفصلة تماما من النسخ. متغير ThreadLocal عادة `تعديل static` الخاص. في نهاية الموضوع، كافة مثيلات ThreadLocal نسخة قريب أنه يستخدم يمكن إعادة تدويرها.

وبشكل عام، أمثلة من ThreadLocal مناسبة يتطلب كل في حد ذاتها منفصلة الخيط والمثال لاستخدامها في أساليب متعددة، أي متغير هل بين المواضيع ومشتركة بين طريقة مشاهد أو فئة .

وسيتم شرح ذلك لاحقا بالتفصيل عن طريق وجهات النظر سبيل المثال. وعلاوة على ذلك، في هذا السيناريو، فإنه ليس من الضروري استخدام ThreadLocal، وإلا تماما نفس التأثير لا يمكن أن يتحقق، وذلك لتحقيق أكثر إحكاما ولكن ThreadLocal.

استخدام ThreadLocal

رمز المثال

ThreadLocal سيتم موضح أدناه باستخدام التعليمات البرمجية التالية تجسيد

دراسة حالة

ThreadLocal نفسها تدعم النموذج. هذا التجسيد يستخدم ThreadLocal نوع المتغير ب StringBuilder. متاح طريقة () يقرأ المثال StringBuidler ThreadLocal عن طريق الحصول عليها، ب StringBuilder يمكن أن توفرها مجموعة (T ر) الأسلوب.

رمز أعلاه النتائج على النحو التالي

اسم الموضوع: موضوع - 1 شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 418873098، القيمة: اسم 0Thread: موضوع - 3، شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 1609588821، القيمة: اسم 0Thread: موضوع - 2، ThreadLocal شفرة التجزئة: 372282300، المثال شفرة التجزئة: 1780437710، القيمة: اسم 0Thread: موضوع - 3، شفرة التجزئة ThreadLocal: 372282300، مثلا شفرة التجزئة: 1609588821، القيمة: اسم 01Thread: موضوع - 1، ThreadLocal شفرة التجزئة: 372282300، مثلا شفرة التجزئة: 418873098، القيمة: اسم 01Thread: موضوع - 3، شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 1609588821، القيمة: اسم 012Thread: موضوع - 3، شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 1609588821، القيمة: 0123Set، اسم الموضوع: موضوع - 3، شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 1362597339، القيمة: مرحبا اسم worldThread: موضوع - 2، شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 1780437710، القيمة: اسم 01Thread: موضوع - 1 شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 418873098، القيمة: اسم 012Thread: موضوع - 2 ح ThreadLocal ashcode: 372282300، مثيل شفرة التجزئة: 1780437710، القيمة: اسم 012Thread: موضوع - 1 شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 418873098، القيمة: اسم 0123Thread: موضوع - 2، شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 1780437710، القيمة: 0123Set اسم الموضوع: موضوع - 1 شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 482932940، القيمة: مرحبا worldSet، اسم الموضوع: موضوع - 2، شفرة التجزئة ThreadLocal: 372282300، مثيل شفرة التجزئة: 1691922941، القيمة: مرحبا العالم

كما يمكن أن يرى من إخراج أعلاه

  • 1-3 يتضح من خط الانتاج، كل موضوع من خلال طريقة الحصول على ThreadLocal () للحصول على الحالات المختلفة ب StringBuilder
  • 1-3 خطوط العرض إخراج كل موضوع هو نفس الوصول إلى متغير ThreadLocal
  • 7،12،13 الإخراج من خط 30 ورمز الخط لتكون واضحة، على الرغم من كل العداد حقل ثابت الدرجة عداد هو الحصول على () من قانون الحصول على سبيل المثال ب StringBuilder وإلحاق سلسلة، ولكن هذا لا يتم إضافة كل المواضيع سوف توضع السلاسل ب StringBuilder في نفسه، ولكن كل موضوع إضافي سلسلة إلى الأمثلة StringBuidler الداخلية منها
  • بعد الصف الأول وخط 15 وخط الانتاج المقارنة الثانية 38 يمكن أن ينظر إليه جنبا إلى جنب مع، واستخدام مجموعة (T تي) الأسلوب، يتم استبدال النقاط متغير ThreadLocal المثال ب StringBuilder

رسم الخرائط المثال ThreadLocal وموضوع الصيانة

لأن كل موضوع لديه حق الوصول الخاصة به إلى متغير ThreadLocal من "المحلية" نسخة المثال. أحد الحلول الممكنة هو الحفاظ على خريطة ThreadLocal، هو الموضوع الرئيسي، قيمته في مثيل الموضوع. احصل على الموضوع من خلال مخطط ThreadLocal () للحصول على سبيل المثال، تحتاج فقط إلى مفتاح في موضوع، يمكنك العثور على سبيل المثال المقابلة من الخريطة. تجسيد كما هو مبين في الشكل.

البرنامج يمكن أن تلبي متطلبات المذكورة أعلاه كل موضوع نسخة احتياطية منفصلة. كل موضوع جديد للوصول إلى ThreadLocal، تحتاج إلى إضافة خريطة لخريطة، وفي نهاية كل موضوع، يجب محو الخريطة. هنا وهناك مشكلتين:

  • زيادة وموضوع موضوع انخفاض حاجة لكتابة الخريطة، وبالتالي فإن الحاجة لضمان أن موضوع آمنة الخريطة. وعلى الرغم من التطور ConcurrentHashMap المادة التكنولوجيا الأساسية متعددة الخيوط جافا يصف عدة طرق لتحقيق موضوع آمنة خريطة، ولكنها تحتاج أكثر أو أقل أقفال لضمان خيط الأمان
  • وفي نهاية الخيط، والحاجة إلى التأكد من أن جميع الزيارات التي ThreadLocal تتم إزالة الخرائط المقابلة، فإنه قد يسبب حدوث تسرب للذاكرة. (في وقت لاحق وسوف نقدم أساليب لتجنب التسريبات الذاكرة)

حيث لتأمين المشاكل، وليس سببا للمخطط JDK المستخدمة.

صيانة الموضوع ورسم الخرائط المثال ThreadLocal

في حل أعلاه، يظهر مشكلة قفل لمواضيع متعددة الوصول إلى نفس الخريطة. إذا حافظت على خريطة كتبها الموضوع، بحيث يكون لكل الموضوع إلى الوصول فقط الخاصة الخريطة الخاصة بهم، ثم إرسال مشكلة متعددة مترابطة، هناك عدم وجود حاجة القفل. تجسيد كما هو مبين في الشكل.

على الرغم من أن البرنامج لا مشكلة لا قفل، ولكن لأنه بعد كل موضوع للوصول إلى متغير ThreadLocal ستحافظ على التعيين من أمثلة متنوعة ونوعية ThreadLocal في الخاصة خريطة، وإذا لم تقم بإزالة هذه المراجع (خرائط)، وهذه لا يمكن إعادة تدويرها ThreadLocal فإنه قد يسبب حدوث تسرب للذاكرة. في وقت لاحق JDK سوف يعرض كيفية حل المشكلة.

نفذت ThreadLocal في JDK 8

ThreadLocalMap تسرب الذاكرة

في هذا التجسيد، خريطة المقدمة من فئة الداخلية الدرجة ThreadLocal ThreadLocalMap ثابت. ومن الأمثلة على هذه الصيانة ThreadLocal الخريطة مثيل محددة. وHashMap الفرق هو أن كل دخول ThreadLocalMap هو زوج واحد رباط  إشارة ضعيفة، يمكن أن ينظر إليه من السوبر (ك). وبالإضافة إلى ذلك، سوف تشمل كل الدخول زوج واحد قيمة الإشارة قوية.

والسبب في استخدام مراجع ضعيفة هو أنه، عندما لا يكون هناك نقطة مرجعية لThreadLocal كثافة متغير، والتي يمكن إعادة تدويرها، وبالتالي تجنب تسبب المشاكل المذكورة أعلاه تسرب الذاكرة ThreadLocal لا يمكن استردادها.

ومع ذلك، وهذا هو أيضا نوع آخر من الذاكرة مشكلة تسرب التي قد تنشأ. يحافظ ThreadLocalMap تعيين متغير ThreadLocal وأمثلة محددة، عندما يتم استرداد متغير ThreadLocal، خريطة الرئيسية تصبح لاغية، والتي لا يمكن إزالتها الدخول. المثال دخول هو أن هذه الذاكرة تسرب إشارة لا يمكن استردادها.

ملاحظة: دخول على الرغم من إشارة ضعيفة، وإنما هو إشارات ضعيفة نوع ThreadLocal (أي أنها فوق رباط إشارة ضعيفة)، وليس ضعف أمثلة محددة إشارة، فإنه من المستحيل لتجنب تسرب الذاكرة المتعلقة أمثلة محددة.

مثال على القراءة

أمثلة على طريقة ليصبح نصها كما يلي

القراءة سبيل المثال، موضوع نفسه ويكتسب أول مرة من قبل ThreadLocalMap getMap (ر) الأسلوب. من يمكن العثور على تعريف عملية أدناه، مثال لهذه الحقل فئة ThreadLocalMap الموضوع، أي تعيين تحتفظ بها الكائن الموضوع المثال محددة ThreadLocal، وهو ما يتسق مع التحليل السابق.

بعد الحصول ThreadLocalMap، `طريقة ThreadLocal الحصول على موضوع المقابلة في ThreadLocalMap دخول التيار by` map.getEntry (هذا). طريقة هذه الأشياء ThreadLocal التي يتم الوصول إليها حاليا.

دخول المكتسبة إن لم يكن باطلا، هو القيم المستخرجة من دخول في المثال يتوافق الحالية للموضوع من الوصول المطلوبة. أمثلة محددة لتحديد القيمة الأولية المتغير المقابلة لموضوع ThreadLocal إذا كان الدخول المكتسبة لاغيا، التي كتبها `setInitialValue ()` الأسلوب.

تعيين القيمة الأولية

تعيين قيمة الأولية على النحو التالي

هذا الأسلوب هو أساليب خاصة لا يمكن طاقتها.

أولا، () طريقة للحصول على القيم الأولية `` initialValue. هذا الأسلوب هو العام، وباطلة عودة الافتراضية. ولذلك، فإن طريقة الاستخدام العادي في كثير من الأحيان فوق طاقتها. أي مثال في المناطق الداخلية منها الحمولة الزائدة فئة مجهولة.

ThreadLocalMap ثم الحصول على موضوع المقابلة للكائن، إذا كان الكائن غير فارغة، ثم مثيل الكائن ThreadLocal رسم الخرائط المباشر المقابلة لThreadLocalMap القيمة الأولية تضاف إلى الموضوع. إذا كان لاغيا، يتم إنشاء الكائن أولا ومن ثم تعيين ThreadLocalMap إضافتها.

لم يكن هناك حاجة للنظر في قضايا السلامة موضوع ThreadLocalMap من. لأن كل موضوع له واحد وهدف واحد فقط ThreadLocalMap، وإلا موضوع يتمكنوا من الوصول إليه، والمواضيع الأخرى التي لم الوصول إلى ThreadLocalMap، أي لا تتم مشاركة الكائن في مواضيع متعددة، لن يكون هناك أي قضايا السلامة الموضوع.

قدوة

بالإضافة إلى الطريقة التي توفرها initialValue () هو القيمة الأولية مثيل، ويمكن أيضا أن يتم تعيين طريقة عن طريق تحديد قيمة سبيل المثال موضوع، كما هو مبين أدناه.

طريقة لاكتساب الكائن ThreadLocalMap الموضوع، ثم المثال جهة رسم الخرائط من الكائنات ThreadLocal بالإضافة المباشرة (أي، هذا الرمز) في ThreadLocalMap. بطبيعة الحال، إذا التعيين موجود بالفعل، والتغطية المباشرة. وبالإضافة إلى ذلك، إذا كان ThreadLocalMap المكتسبة لاغيا، إنشاء كائن ThreadLocalMap.

منع التسرب في الذاكرة

للكائنات ThreadLocal لم تعد في الاستخدام ثم تم استردادها، والأمثلة التي تعادل كل موضوع في موضوع بسبب ThreadLocalMap من دخول إشارات قوية، لا يمكن استردادها، فإنه قد يسبب حدوث تسرب للذاكرة.

لحل هذه المشكلة، وSET طريقة ThreadLocalMap، والطريقة التي replaceStaleEntry جميع مفاتيح المقرر أن دخول القيم باطل هو باطل، بحيث تكون قيمة يمكن استردادها. وعلاوة على ذلك، فإن المفتاح يكون لاغيا ويتم تعيين القيمة إلى الدخول لاغية من قبل expungeStaleEntry طريقة إعادة صياغة بحيث العملية يمكن استرداد الدخول. بهذه الطريقة، تسرب الذاكرة ThreadLocal يمكن الوقاية منها.

المشهد ينطبق

كما هو موضح أعلاه، ينطبق ThreadLocal إلى السيناريو التالي اثنين

  • يتطلب كل موضوع نسخة منفصلة خاصة بها
  • احتياجات الأمثلة لتكون مشتركة في أساليب متعددة، ولكن لا تريد أن تكون متعددة الخيوط تمت مشاركته

بالنسبة للنقطة الأولى، كل موضوع له المثال الخاص بها، أدرك أنه هناك العديد من الطرق. قد يتم بناؤها، على سبيل المثال، نسخة منفصلة داخل الموضوع. ThreadLoca قادرة على تلبية الطلب في شكل مناسب جدا.

بالنسبة للنقطة الثانية، قد تكون النقطة الأولى (كل موضوع له المثال الخاص بها) اقتنعت حالة، شكل إشارة أقره طريقة أمور المنفذة. ThreadLocal خفض اقتران هذه المدونات، وتحقيق أكثر أناقة.

حالة

لتطبيقات جافا ويب، حفظ الدورة الكثير من المعلومات. غالبا ما يحتاجون إلى الوصول إلى المعلومات من خلال الدورة، هناك أوقات عندما تحتاج إلى تعديل المعلومات الدورة. من ناحية، والحاجة لضمان أن كل موضوع له سبيل المثال الدورة خاص به. من ناحية أخرى، وذلك بسبب الحاجة للعمل في أجزاء كثيرة من الدورة، وهناك طرق متعددة لتبادل دورة الطلب. إذا لم تكن تستخدم في ThreadLocal، قد يتم بناؤها كل موضوع في مثيل الدورة، والمقام بين عدد وافر من وسائل النقل، كما هو مبين أدناه.

وهذه الطريقة يمكن أن يتحقق الاحتياجات. ولكن كل من الدورة عند الضرورة، تتطلب صريح الكائن Session انتقال، وارتفاع درجة اقتران بين الأساليب.

كما المستخدمة هنا، ThreadLocal إعادة تنفيذ وظيفة كما هو مبين أدناه.

بعد التحول التعليمات البرمجية باستخدام ThreadLocal، لا حاجة أطول لتمرير الكائن Session بين الأساليب المختلفة، وأيضا من السهل جدا لضمان أن كل موضوع له مثيل منفصلة خاصة بها.

اذا نظرتم الى الكثير منها في بعض نقطة، طرق بديلة. على سبيل المثال، عن طريق إنشاء متغير محلي في موضوع لا يمكن أن يتحقق كل موضوع له مثيل الخاص، واستخدام متغيرات ثابتة يمكن أن تكون مشتركة بين المتغيرات في الأسلوب. ولكن إذا كنت ترغب في تلبية متغيرات المشتركة بين العزلة والأساليب بين المواضيع، ThreadLocal مناسب جدا.

ملخص

  • ThreadLocal لا يحل مشكلة تقاسم البيانات بين المواضيع
  • ThreadLocal التي كتبها ضمنا إنشاء نسخة منفصلة من الحالات في المواضيع المختلفة لتجنب المثال من القضايا موضوع السلامة
  • كل موضوع يحمل ويحافظ على تعيين خريطة الكائنات ThreadLocal مع أمثلة محددة، وخارطة ويرجع ذلك فقط إلى عقد وصول مؤشر الترابط الخاص، حتى لا يكون هناك أي مشاكل موضوع آمنة وقفل
  • ThreadLocalMap من الدخول هو إشارة إلى إشارة ضعيفة ThreadLocal، وجوه ThreadLocal هو تجنب هذه المشكلة لا يمكن استردادها
  • ThreadLocalMap عافيته مجموعة المفتاح لقيمة لاغية وجوه الدخول عن طريق الاتصال طريقة replaceStaleEntry (أي محددة مثلا) ومنع الكائن نفسه ذاكرة الدخول التسريبات
  • ThreadLocal تنطبق على عزل متغير بين المواضيع ومشتركة بين أساليب المشهد

متعددة الخيوط جافا الأساسية تطور التكنولوجيا ConcurrentHashMap

جميلة جيدة، فيوسونيك VX2276-smhd عرض لقطة حقيقية ألعاب الفيديو

اللاعبون في الخارج أسبوع واحد جرد: الدوري الاسباني وو لي جعلت هذه النقطة، زانج يونينغ يساعد الإرسال

JAVA I / O نموذج من نمط BIO مفاعل وNIO

الأبيض الأصلي من معظم الكهرباء باهظة الثمن، فيوسونيك VX2276-smhd اختبار مراقبة استهلاك الطاقة

فإن الفرق لن يكون بيثون بيثون و، والآخر لإرسال PDF الكتاب الإلكتروني

بسيطة وعملية! فيوسونيك VX2276-smhd إعدادات واجهة عرض الشاشة

كوخ فون 8 الخط الرسمي على الانترنت: التفاح بالحرج لاختيار الثقوب في

التحقيق لا هوادة فيها الهند الصينية الكراهية الهاتف المحمول الدخن للعودة إلى أخذ زمام المبادرة الوقوف

جافا سلسلة المتقدم (أ) جافا الشرح (الشرح)

الحصول على إصبع أنيقة! في هذه اللعبة يمكنك عند كبار السن من السائقين

قاعدة بيانات أوراكل الترقية عبر الإنترنت