سؤال

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

انها أساسا العنكبوت متعدد الخيوط على شبكة الإنترنت، وتحديث نفس كائن بنية البيانات -> int.

لذلك، من المؤكد أنه مبالغ فيه لاستخدام قاعدة بيانات لهذا الغرض، والشيء الوحيد الذي يمكنني التفكير فيه هو Singleton الآمن مؤشر ترابط يستخدم لاحتواء بنية بياناتي. http://web.archive.org/web/20121106190537/http://www.ibm.com/developerworks/java/library/j-dcl/index.html.

هل هناك نهج مختلف يجب أن أنظر إليه؟

هل كانت مفيدة؟

المحلول

ثبت أن قفل مزدوج تم فحصه أنه غير صحيح وعيوب (على الأقل في جافا). هل البحث أو إلقاء نظرة على دخول ويكيبيديا السبب بالضبط.

أولا وقبل كل شيء صحيحة البرنامج. إذا لم يكن الرمز الخاص بك آمنا للخيط (في بيئة متعددة الخيوط)، فقد تم كسره. صحة يأتي أولا قبل تحسين الأداء.

أن تكون صحيحة عليك مزامنة الكل getInstance طريقة

public static synchronized Singleton getInstance() {
   if (instance==null) ...
}

أو تهيئة قانونية

private static final Singleton INSTANCE = new Singleton();

نصائح أخرى

ربما لا جدال باستخدام تهيئة كسول لقاعدة البيانات في مجنزرة الويب جديرا بالاهتمام. تهيئة كسول يضيف تعقيدا وضرب السرعة المستمرة. حالة واحدة حيث يتم تبريرها هي عندما تكون هناك فرصة جيدة لن تكون هناك حاجة إلى البيانات. أيضا، في تطبيق تفاعلي، يمكن استخدامه للحد من وقت بدء التشغيل وإعطاء وهم السرعة.

للحصول على تطبيق غير تفاعلي مثل مجنزرة الويب، مما ستحتاج بالتأكيد إلى قاعدة بياناتها الموجودة على الفور، فإن التهيئة الكسول هي مناسبا فقيرا.

من ناحية أخرى، فإن المجنزرة على شبكة الإنترنت متوازية بسهولة، وسوف تستفيد بشكل كبير من كونها متعددة الخيوط. باستخدامه كممارسة لإتقان java.util.concurrent ستكون المكتبة جديرة للغاية. على وجه التحديد، انظر إلى ConcurrentHashMap و ConcurrentSkipListMap, والتي ستتيح مواضيع متعددة لقراءة وتحديث خريطة مشتركة.

عندما تتخلص من التهيئة الكسول، فإن أبسط نمط Singleton هو شيء مثل هذا:

class Singleton {

  static final Singleton INSTANCE = new Singleton();

  private Singleton() { }

  ...

}

الكلمة الرئيسية final هو المفتاح هنا. حتى لو قمت بتوفير static "Getter" بالنسبة للطفرات بدلا من السماح بالوصول المباشر المباشر، مما يجعل Singleton final يساعد على ضمان صحة ويسمح بتحسين أكثر عدوانية من قبل عبور جيت.

إذا كانت حياتك تعتمد على عدد قليل من Microseconds، فسأنصحك بتحسين قفل الموارد الخاص بك إلى حيث يهم بالفعل.

ولكن في هذه الحالة هي الكلمة الرئيسية هنا مشروع هواية!

مما يعني أنه إذا قمت بمزامنة بأكملها GetInstance () الطريقة ستكون على ما يرام في 99.9٪ من جميع الحالات. لن أوصي بذلك بطريقة أخرى.

في وقت لاحق، إذا أثبتت عن طريق التنميط أن GetInstance () المزامنة هي عنق الزجاجة لمشروعك، ثم يمكنك التحرك وتحسين التزامن. لكنني أشك في أنه سوف يسبب لك مشكلة.

من جديد

جرب ال بيل بوغ حل التهيئة على حامل الطلب المصطلح. الحل هو الأكثر محمولة عبر محطات جافا المختلفة والآلات الافتراضية. الحل آمن للخيط دون الحاجة إلى بناء لغة خاصة (أي متقلبة و / أو متزامنة).

http://en.wikipedia.org/wiki/singleton_pattern#te_solution_of_bill_pugh.

كما يقول جوشوا بلوش في كتابه "الطبعة الفعالة Java 2nd Edition"، أتفق أيضا على أن نوع عنصر عنصر واحد هو أفضل طريقة لتنفيذ Singleton.

public enum Singleton {
  INSTANCE;

  public void doSomething() { ... }
}

إذا نظرت إلى أسفل تلك المقالة، سترى الاقتراح فقط استخدام حقل ثابت. سيكون ذلك ميلي: أنت لا تحتاج حقا إلى إنشاء مثيل كسول (لذلك لا تحتاج getInstance() أن تكون كل من الملحق وطريقة المصنع). تريد فقط التأكد من أن لديك واحدا فقط من هذه الأشياء. إذا كنت بحاجة حقا إلى الوصول العالمي إلى أحد الأشياء، فسأستخدمها هذا الشفرة عينة نحو أسفل جدا:

class Singleton
{
  private Vector v;
  private boolean inUse;
  private static Singleton instance = new Singleton();

  private Singleton()
  {
    v = new Vector();
    inUse = true;
    //...
  }

  public static Singleton getInstance()
  {
    return instance;
  }
}

لاحظ أنه يتم الآن بناء Singleton أثناء تثبيت الحقول الثابتة. هذا يجب أن يعمل وليس مواجهة مخاطر الخيوط من الأشياء المحتملة لمزامنة الأشياء.

كل ما قله، ربما ما تحتاجه حقا هو أحد هياكل البيانات الآمنة للخيط المتاحة في JDKS الحديثة. على سبيل المثال، أنا معجب كبير oncurenthmap.: سلامة الخيط زائد ليس لدي لكتابة الرمز (FTW!).

لماذا لا تنشئ بنية بيانات تمر عليها كل من مؤشرات الترابط مثل حقن التبعية. بهذه الطريقة لا تحتاج إلى singleton. ما زلت بحاجة إلى جعل الخيط آمن.

المحادثات التي تشير إليها فقط تتحدث عن إنشاء كائن Singleton، يفترض أن مجموعة في هذه الحالة، آمنة للخيط. تحتاج أيضا إلى مجموعة آمنة للخيط بحيث تعمل عمليات المجموعة أيضا كما هو متوقع. تأكد من أن المجموعة الأساسية في Singleton متزامنة، وربما باستخدام oncurenthmap..

تحقق من هذه المقالة تنفيذ نمط Singleton في C #

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
}

ماذا عن:

public static Singleton getInstance() {
  if (instance == null) {
    synchronize(Singleton.class) {
      if (instance == null) {
         instance = new Singleton();
      }
    }
  }

  return instance;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top