سؤال

لدي حاجة لمكافحة من النوع long مع المتطلبات / الحقائق التالية:

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

بناء على هذه المتطلبات، كيف تختار تنفيذ العداد الخاص بك؟ باعتبارها بسيطة long, ، ك volatile long أو باستخدام an. AtomicLongب لماذا ا؟

في الوقت الحالي، لدي volatile long لكنه كان يتساءل عما إذا كان نهج آخر سيكون أفضل. أنا أيضا زيادة بلدي الطويل من خلال القيام ++counter في مقابل counter++. وبعد هل هذا حقا أكثر كفاءة (كما كنت أدى إلى تصديق مكان آخر) لأنه لا يوجد أي مهمة؟

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

المحلول

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

مشكلة واحدة هي التي تقرأ ويكتب إلى long نكون ليس مطلوب أن تكون ذرية, ، بواسطة مواصفات JVM إذا لم يتم الإعلان عنها volatile. وبعد هذا يعني أن مؤشر ترابط القراءة يمكن أن يحصل على قيمة خيالية إلى حد كبير إذا كان يقرأ القيمة بينما قام موضوع الكتابة بتحديث جزء واحد من القيمة، ولكن ليس الآخر.

الفرق بين ++counter و counter++ هو من المحتمل غير ذي صلة، حيث أن JVM سيدرك أن قيمة التعبير لا يتم استخدامها بعد الآن واثنين ما يعادلان في هذه الحالة.

نصائح أخرى

في Java 8، استخدم Longadder وهو أفضل من Atomiclong حيث خلاف موضوع مرتفع.

Longadder Javadoc:

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

ما هو متطلبات التشغيل للبرنامج الخاص بك؟ هل يمكن أن تفعل القيام مع INT-Politile Int و Racy-يقرأ؟

10 ^ 4 الزيادات / الثانية هو 1 كل 100 USEC. الكفاءة ليست مشكلة، لكن الذرية قد تكون. قد يكون لديك نسختين منه، وعند قراءة، إذا لم تكن متساوتين، اقرأها مرة أخرى.

هذه مقالة - سلعة يتحدث عن الطرق الممكنة لتنفيذ عداد أعتقد أن هذا التنفيذ يجب أن يعمل من أجلك

class LessNaiveVolatieIdGenerator {
private static volatile long id = 0;
public static long nextId() {
    long nextId = (id = id + 1); // or nextId = id++;
    return nextId;
}

}

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