English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

جمع المعلومات حول تنفيذ نموذج Singleton في Java

تحقيق نموذج Singleton في Java،تم تنظيم عدة طرق لتحقيق نموذج Singleton في Java:

يوجد الكثير من الكتب التي تكتب عن نموذج Singleton بهذه الطريقة:

public class SingleTon1 {
  private SingleTon1(){ 
  }
  private static SingleTon1 instance = null;
  public static SingleTon1 getInstance(){
    if(instance == null){
      instance = new SingleTon1();
    }
    return instance;
  }
}

  لكن في التطوير العملي لن يتم كتابة هذا، لأن هناك مشكلة خطيرة، عند الوصول المتعدد للأنماط في الأنماط المتعددة قد تظهر عدة نماذج!!

فيما يلي قائمة ببعض الطرق الشائعة:

1.استخدام كلمة المفتاح synchronized

package singleton;
public class SingleTon1 {
  private SingleTon1(){
  }
  private static SingleTon1 instance = null;
  //الحل الأول لمشكلة الأنماط المتعددة في الوقت الحقيقي، ولكن الكفاءة منخفضة! لأن كل مرة يتم فيها التطبيق سيتم إضافة قفل!
  public static synchronized SingleTon1 getInstance(){
    if(instance == null){
      instance = new SingleTon1();
    }
    return instance;
  }
  public void print(){
    System.out.println("thread_id:"+Thread.currentThread().getId());
  }
  private static Object object = new Object();
  //很巧妙的方法,只有在null的时候加锁,之后就不加啦
  public static SingleTon1 getInstance2(){
    if(instance == null){
      synchronized (object){
        instance = new SingleTon1();
      }
    }
    return instance;
  }
}

 2.加锁

package singleton;
import java.util.concurrent.locks.ReentrantLock;
public class SingleTon2 {
  private SingleTon2(){
  }
  private static ReentrantLock lock = new ReentrantLock();
  private static SingleTon2 instance = null;
  public void print(){
    System.out.println("thread_id:"+Thread.currentThread().getId());
  }
  public static SingleTon2 getInstance2(){
    if(instance == null){
      lock.lock();
      if(instance == null){ //注意这里还要判断下!!
        instance = new SingleTon2();
      }
      lock.unlock();
    }
    return instance;
  }
}

  3.利用静态变量:

package singleton;
public class SingleTon3 {
  public static void print(){
    System.out.println("thread_id:"+Thread.currentThread().getId());
  }
  public static Nested getNested(){
    return Nested.instance;
  }
  //这个是单例创建的类
  static class Nested{
   private Nested(){
    }
  static Nested instance = new Nested();
  }
}

以上就是常用的创建单例的模式:

Test测试代码:

package singleton;
import singleton.SingleTon3.Nested;
public class Test2 {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Nested singleton;
    Myrunnable mm = new Myrunnable();
    Myrunnable m1 = new Myrunnable();
    Myrunnable2 m2 = new Myrunnable2();
    new Thread(m1).start();
    new Thread(m2).start();
    if(m1.singleton == m2.singleton){ // هما نفسه
      System.out.println("هما نفسه");
    }else{
      System.out.println("ليس نفسه");
    }
   }
}
  class Myrunnable implements Runnable{
    Nested singleton;
      @Override
      public void run() {
        // TODO Auto-generated method stub
        singleton = SingleTon3.getNested();
        SingleTon3.print();
      }
  }
  class Myrunnable2 implements Runnable{
    Nested singleton;
    @Override
    public void run() {
      // TODO Auto-generated method stub
      singleton = SingleTon3.getNested();
      SingleTon3.print();
    }
  }

الإخراج:

هما نفسه

thread_id:11
thread_id:10

شكرًا على القراءة، نأمل أن يساعدكم هذا، شكرًا لدعمكم لهذا الموقع!

بيان: محتوى هذا المقال تم جمعه من الإنترنت، يحق للمالك الأصلي الحصول عليه، يتم جمع المحتوى من قبل المستخدمين عبر الإنترنت بشكل متعاوني ويتم تحميله بشكل مستقل، هذا الموقع لا يملك حقوق الملكية، ولا يتم تعديل المحتوى بشكل إنساني، ولا يتحمل أي مسؤولية قانونية. إذا اكتشفت أي محتوى يخالف حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وتقديم الدليل ذات صلة، وإذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.

الشئ الذي قد يثير اهتمامك