الأول (رجل كسول ، الخيط غير آمن):
الطبقة العامة المفردة {مثيل Singleton الخاص ؛
طريقة الكتابة هذه واضحة ، لكن القاتل هو أنه لا يمكن أن يعمل بشكل طبيعي على متعددة.
النوع الثاني (رجل كسول ، سلامة الخيط):
الطبقة العامة المفردة {private static singlet ؛
يمكن أن تعمل طريقة الكتابة هذه بشكل جيد في الفرات المتعددة ، ويبدو أنها تحتوي أيضًا على تحميل كسول جيد.
ثالث (رجل جائع):
مثيل Singleton الطبقي العام {private static singlet = New Singlet () ؛
تعتمد هذه الطريقة على آلية المصنف لتجنب مشكلات التزامن المتعددة. تحميل.
النوع الرابع (الرجل الجائع ، البديل):
الطبقة العامة {private singlet extreal = null ؛
على السطح ، يبدو الأمر مختلفًا تمامًا.
الخامس (الطبقة الداخلية الثابتة):
الطبقة العامة Singleton {private static class Singleter {مثيل خاص ثابت في المجلس الواحد = New Singleton () ؛} Singlet الخاص () {} static static l singleton getinstance () {return singletonholder.instance ؛}}
تستخدم هذه الطريقة أيضًا آلية المصنف لضمان وجود خيط واحد فقط عند تهيئته. عند تحميله ، سيتم إنشاء مثيل (لم يحقق تأثير التحميل كسول) ، وهذه الطريقة هي أنه يتم تحميل فئة Singleton ، وقد لا يتم تهيئة المثيل. نظرًا لأن فئة حامل Singletonhold لا يتم استخدامها بنشاط ، فإنها ستعرض فئة حامل Singletonholder فقط عندما يتم عرضها من خلال استدعاء طريقة getInstance إلى مثيل تم تأسيسه على الفور. تخيل أنه إذا كان المثيل المؤسسي يستهلك الموارد ، فأريد منه أن يؤخر التحميل. لاستخدامه حتى يتم استخدامه كنتيجة. في هذا الوقت ، هذه الطريقة معقولة جدًا مقارنة بالطرق الثالثة والرابعة.
النوع السادس (التعداد):
التعداد العام singleton {مثيل ؛
هذه الطريقة هي مؤلفة JAVA فعالة.
السابع (قفل المدرسة المزدوج):
الطبقة العامة Singleton {Private Folatile Static Singleton Singleton ؛ ؛}}} إرجاع Singleton ؛}}
هذه نسخة مطورة من الطريقة الثانية ، المعروفة باسم قفل التفتيش المزدوج ، يرجى التحقق من التفاصيل: http://www.ibm.com/developerworks/cn/java/j-dcl.html
بعد JDK1.5 ، يمكن أن يحقق قفل التفتيش المزدوج التأثير المفرد بشكل طبيعي.
لخص
هناك سؤالان يثيران الانتباه إلى:
1. إذا تم تحميل الحالة الفردية بواسطة أنواع مختلفة من اللوادر ، فقد يكون هناك العديد من مثيلات حقيبة واحدة. لنفترض أنه ليس وصولًا عن بعد.
2. إذا قامت Singleton بتنفيذ واجهة Java.io.serializable ، فقد يتم تسلسل مثيلات هذه الفئة واستعادتها. في أي حال ، إذا قمت بتسلسل كائن من فئة الفردي ، ثم استعادة كائنات متعددة ، فستكون لديك أمثلة متعددة لفئة أحادية واحدة.
طريقة إصلاح السؤال الأول هي:
فئة ثابتة خاصة getClass (الاسم الفئة السلسلة)
يلقي classnotfoundException {
ClassLoader ClassLoader = thread.currentThRead ().
if (classloader == null)
classloader = singleton.class.getClassLoader () ؛
return (classloader.loadClass (className)) ؛
}
}
طريقة إصلاح السؤال الثاني هي
الطبقة العامة Singletton تنفذ java.io.serializable {
مثيل Singleton الثابت العام = New Singleton () ؛
Singleton المحمي () {
}
كائن خاص ReadResolve () {
مثيل العودة ؛
}
}
بالنسبة لي ، أفضل الطريق الثالث والخامس ، بسيط وسهل الفهم ، وأدرك سلامة الخيط في طبقة JVM (إذا لم تكن بيئة محمولة متعددة الفصول). استخدم الطريقة الخامسة فقط عندما يتم تحقيق تأثير التحميل الكسول. لن أستخدم الأساليب الأولى والثانية أبدًا.
============================================ ======== ==============
ملخص زملاء الدراسة Superheizai بشكل جيد للغاية:
ومع ذلك ، بشكل عام ، ليس أول مثال واحد ، فإن النوع الرابع والثالث هو واحد. لذلك ، فإن الفردي العام هم خمس طرق للكتابة. الرجال الكسولون ، الرجال الأشرار ، أقفال المدرسة المزدوجة ، التعداد والفصول الداخلية الثابتة.
أنا سعيد جدًا بوجود مثل هذا القارئ وتشجيعهم معًا.