سؤال

تكرار ممكن:
ما هي تكلفة (الخفية) من فال الكسول؟ (سكالا)

يسمح Scala بتعريف القيم الكسول

lazy val maybeUnusedValue = someCostlyInitialization

أين someCostlyInitialization يتم تقييمه فقط على الاستخدام الأول لـ maybeUnusedValue. أي أنه يتم تقييمه مرة واحدة على الأكثر ، وإذا maybeUnusedValue لا يتم استخدامه أبدًا ، كما أنه لا يتم تقييمه أبدًا على الإطلاق.

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

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

المحلول

تم صنعه آمنًا لخيط الخيط باستخدام قفل مزدوج الفحص http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html من الواضح أن هذا يعني أن الوصول إلى فالس البطيئة أبطأ من تلك غير الباطنية.

نصائح أخرى

تحديث: عفوًا ، كما أوضح فاسيل ، فإن السؤال هو نسخة من مؤشر ترابط آخر ، وكما يحدث ، وكذلك هذا الإجابة.

أخذت هذا الفصل:

class Foo {
  lazy val test = "hi"
}

تم تجميعها وخلطها (مع JD-GUI):

public class Foo
  implements ScalaObject
{
  private String test;
  public volatile int bitmap$0;

  public String test()
  {
    if (
      (this.bitmap$0 & 0x1) == 0);
    synchronized (this)
    {
      if (
        (this.bitmap$0 & 0x1) == 0) {
        this.test = "hi"; this.bitmap$0 |= 1; } return this.test;
    }
  }
}

كما ترون ، يستخدم نموذج الفحص المزدوج مع متغير متطاير. لذلك أعتقد أنه آمن

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