عدة طرق لتنفيذ نمط Java Singleton
هذا هو عدد الكتب التي تكتب:
الطبقة العامة singleton1 {private Singleton1 () {} مثيل خاص ثابت Singleton1 = null ؛ public static singleton1 getInstance () {if (exture == null) {exate = new Singleton1 () ؛ } مثيل الإرجاع ؛ }}ومع ذلك ، فإن هذا غير مكتوب في التطوير الفعلي ، لأن هناك مشكلة خطيرة: عند الوصول إلى وصول متزامن متعدد الخيوط ، قد يتم إنشاء مثيلات متعددة! !
فيما يلي بعض الطرق شائعة الاستخدام:
1. استخدم الكلمات الرئيسية المتزامنة
حزمة المفرد. الطبقة العامة singleton1 {private Singleton1 () {} مثيل خاص ثابت Singleton1 = null ؛ // الحل 1 من مشكلة متعددة الخيوط ، لكنها ليست فعالة! لأن كل مكالمة سيتم قفلها! SINCHRONIST SYNCLETON1 GETINSTANCE () {if (مثيل == null) {مثيل = جديد singleton1 () ؛ } مثيل الإرجاع ؛ } public void print () {system.out.println ("thread_id:"+thread.currentThRead (). getId ()) ؛ } كائن ثابت خاص = كائن جديد () ؛ // طريقة ذكية للغاية ، فقط عند إضافة فارغة ، لا يوجد Singleton1 Singleton1 getInstance2 () {if (مثيل == null) {synchronized (object) {estance = new singleton1 () ؛ }} مثيل الإرجاع ؛ }} 2. إضافة القفل
حزمة المفرد. استيراد java.util.concurrent.locks.reentrantlock ؛ الطبقة العامة singleton2 {private singleton2 () {} قفل reentrantlock ثابت خاص = جديد reentrantlock () ؛ مثيل Singleton2 الخاص = NULL ؛ public void print () {system.out.println ("thread_id:"+thread.currentThRead (). getId ()) ؛ } singleton2 getInstance2 () {if (مثيل == null) {lock.lock () ؛ إذا (مثيل == null) {// لاحظ أن هناك حكمًا آخر هنا! ! مثيل = جديد singleton2 () ؛ } lock.unlock () ؛ } مثيل الإرجاع ؛ }} 3. استخدم المتغيرات الثابتة:
حزمة المفرد. الطبقة العامة singleton3 {public static void print () {system.out.println ("thread_id:"+thread.currentThread (). getId ()) ؛ } static static detnested () {return nested.instance ؛ }. }}ما سبق هو نمط إنشاء سينجلتون شائع الاستخدام:
رمز الاختبار:
حزمة المفرد. استيراد singleton.singleton3.nested ؛ الفئة العامة test2 {public static void main (string [] args) {// todo method method method method tuto clusleton ؛ myrunnable mm = new myrunnable () ؛ myrunnable M1 = new myrunnable () ؛ myrunnable2 m2 = new myrunnable2 () ؛ موضوع جديد (M1) .start () ؛ موضوع جديد (M2) .start () ؛ if (m1.singleton == m2.singleton) {// إنه نفس system.out.println ("هو نفسه") ؛ } آخر {system.out.println ("ليس هو نفسه") ؛ }}} class myrunnable الأدوات runnable {nested singleton ؛ Override public void run () {// todo method method method actleton = singleton3.getnested () ؛ singleton3.print () ؛ }} class myrunnable2 تنفذ runnable {nested singleton ؛ Override public void run () {// todo method method method actleton = singleton3.getnested () ؛ singleton3.print () ؛ }}الإخراج:
إنه نفس الشيء
thread_id: 11
thread_id: 10
ما سبق هو مجموعة من معلومات نموذج Java Singleton. سنستمر في إضافة المعلومات ذات الصلة في المستقبل. شكرا لدعمكم لهذا الموقع!