1. المفردة على الطريقة الصينية الجائعة
انسخ رمز الكود كما يلي:
الطبقة العامة سينجلتون {
Singleton INSTANCE النهائي الخاص = new Singleton();
سينجلتون خاص () { }
public static Singleton getInstance() {
حالة الإرجاع؛
}
}
2. بمساعدة الطبقات الداخلية
إنه مفرد كسول لأن آلية Java تنص على أنه سيتم تحميل الفئة الداخلية SingletonHolder (يتم تنفيذها كسولًا) فقط عند استدعاء طريقة getInstance () لأول مرة، وتكون عملية التحميل الخاصة بها آمنة لمؤشر الترابط. يتم إنشاء المثيل مرة واحدة عند تحميل الفئة الداخلية.
انسخ رمز الكود كما يلي:
الطبقة العامة سينجلتون {
سينجلتون خاص () { }
فئة ثابتة خاصة SingletonHolder {
Singleton INSTANCE النهائي الخاص = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
3. حل القفل العادي
انسخ رمز الكود كما يلي:
الطبقة العامة سينجلتون {
مثيل Singleton ثابت خاص = فارغ؛
سينجلتون خاص () { }
getInstance () مفردة متزامنة عامة ثابتة {
إذا (المثيل == فارغ) {
مثيل = مفرد جديد () ؛
}
مثيل الإرجاع؛
}
}
على الرغم من حل مشكلة سلامة سلسلة المحادثات، يجب قفل كل سلسلة رسائل تستدعي getInstance، ونريد قفلها فقط عند استدعاء getInstance لأول مرة، يرجى الاطلاع على حل الكشف المزدوج أدناه.
4. الكشف المزدوج، ولكن انتبه إلى طريقة الكتابة
انسخ رمز الكود كما يلي:
الطبقة العامة سينجلتون {
مثيل Singleton ثابت خاص = فارغ؛
سينجلتون خاص () { }
public static Singleton getInstance() {
إذا (المثيل == فارغ) {
متزامن (Singleton.class) {
درجة الحرارة المفردة = مثيل؛
إذا (درجة الحرارة == فارغة) {
temp = new Singleton();
مثيل = درجة الحرارة
}
}
}
مثيل الإرجاع؛
}
}
بسبب مشكلة إعادة ترتيب التعليمات، لا يمكن كتابتها مباشرة على النحو التالي:
الطبقة العامة سينجلتون {
مثيل Singleton ثابت خاص = فارغ؛
سينجلتون خاص () { }
public static Singleton getInstance() {
إذا (المثيل == فارغ) {
متزامن (Singleton.class) {
إذا (المثيل == فارغ) {
مثيل = مفرد جديد () ؛
}
}
}
مثيل الإرجاع؛
}
}
ولكن إذا تم تعديل متغير المثيل باستخدام متغير، فسيكون جيدًا إذا تم تعديله باستخدام متغير، فيمكنه التأكد من عدم إعادة ترتيب التعليمات المقابلة للمثيل = new Singleton(); آمن:
الطبقة العامة سينجلتون {
مثيل Singleton المتطاير الخاص الثابت = null؛
سينجلتون خاص () { }
public static Singleton getInstance() {
إذا (المثيل == فارغ) {
متزامن (Singleton.class) {
إذا (المثيل == فارغ) {
مثيل = مفرد جديد () ؛
}
}
}
مثيل الإرجاع؛
}
}