القيم البطيئة Scala: عقوبة الأداء؟ Througsafe؟ [مكرر
-
28-09-2019 - |
سؤال
تكرار ممكن:
ما هي تكلفة (الخفية) من فال الكسول؟ (سكالا)
يسمح 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;
}
}
}
كما ترون ، يستخدم نموذج الفحص المزدوج مع متغير متطاير. لذلك أعتقد أنه آمن