أعتقد أن الجميع على دراية بنموذج Singleton ، وعادة ما تنقسم أساليب التنفيذ إلى النوعين التاليين:
نسخة الكود كما يلي:
// التنفيذ كسول
الطبقة العامة سينجلتون {
مثيل Singleton ثابت خاص = فارغ ؛
Singleton الخاص () {}
newinstance الثابت العام () {
if (null == مثيل) {
مثيل = جديد singleton () ؛
}
مثيل العودة ؛
}
الفراغ العام dosomething () {
// افعل شيئًا ...
}
}
// الطراز الصيني الجياع
الطبقة العامة سينجلتون {
مثيل Singleton ثابت خاص = New Singleton () ؛
Singleton الخاص () {}
Singleton Singleton Newinstance () {
مثيل العودة ؛
}
الفراغ العام dosomething () {
// افعل شيئًا ...
}
}
في استخدام وضع المصلحة الواحدة ، فإن النمط الكسول والجائع لديه سيناريوهات تطبيق مختلفة. لاستخدامه فقط عند بدء تشغيل المشروع.
في الوضعين أعلاه ، إذا كنت متعددة الخيوط ، فلن تكون هناك مشاكل مع أسلوب الرجل الجائع ، لأن JVM لن يحمل سوى فئة الاهتمام الفردية مرة واحدة ، ولكن أسلوب الرجل الكسول قد يواجه مشكلة في إنشاء مصلحة واحدة مرارًا وتكرارًا الكائنات ، وهو أن الخيط غير آمن.
فهل هناك طريقة لجعل وضع المصلحة الواحدة لآمنة الخيط على طراز الرجل الجائع؟ هناك بالتأكيد أي إجابات. في كثير من الحالات ، زودتنا JVM بالتحكم في التزامن ، مثل:
أ.
ب.
عندما تقوم JVM بتحميل الفصل ، فإنه يضمن مزامنة البيانات.
استخدم الفئات الداخلية على مستوى الفصل لإنشاء مثيلات كائن في هذه الفئة الداخلية. وبهذه الطريقة ، طالما أنك لا تستخدم الفصول الداخلية على مستوى الفصل ، فلن تقوم بإنشاء مثيلات كائنات ، وبالتالي تحقيق سلامة كسول كسول وسلامة الخيوط.
نسخة الكود كما يلي:
الطبقة العامة سينجلتون {
// الفئة الداخلية ، سيتم إنشاء كائن الاهتمام البسيط فقط عند تحميل الفئة الداخلية
عازف Singletonholder الخاص بالفئة الثابتة {
مثيل Singleton الثابت العام = New Singleton () ؛
}
Singleton الخاص () {}
Singleton Singleton Newinstance () {
إرجاع Singletonholder.instance ؛
}
الفراغ العام dosomething () {
// افعل شيئًا
}
}
هذا يمكن أن يدرك نموذج سعر واحد آمن مؤشر الترابط.
بالإضافة إلى ذلك ، يمكننا أيضًا تنفيذ وضع المصلحة الواحدة من خلال أنواع التعداد ، والتي تعد أيضًا طريقة أكثر موصى بها.
إن تنفيذ نمط المفرد باستخدام أنواع التعداد هو كما يلي:
نسخة الكود كما يلي:
التعداد العام المفرد {
// تحديد عنصر مكون ، إنه مثيل للفرد المفرد
مثال؛
الفراغ العام dosomething () {
// افعل شيئًا ...
}
}
حسنًا ، تم تقديم وضع Singleton هنا.