هل يجعل القفل (objlocker) هذا التطبيق آمنًا لموضوع الكائن على نطاق واسع؟وهل الأعضاء الثابتون آمنون تلقائيًا؟

StackOverflow https://stackoverflow.com/questions/274344

سؤال

عندما تقوم بقفل كائن ما، هل يتم قفل هذا الكائن خلال التطبيق بأكمله؟

على سبيل المثال، هذا المقتطف من C# 3.0 في قسم باختصار 19.6.1 "سلامة الخيوط وأنواع .NET Framework":

static void AddItems(  )
  {
    for (int i = 0; i < 100; i++)
      lock (list)
        list.Add ("Item " + list.Count);

    string[] items;
    lock (list) items = list.ToArray(  );
    foreach (string s in items) Console.WriteLine (s);
  }

هل القفل الأول:

lock (list)
        list.Add ("Item " + list.Count);

منع موضوع آخر من الوصول:

lock (list) items = list.ToArray(  );

أم يمكن تنفيذهما في نفس الوقت؟

وهل يجعل CLR مؤشر ترابط الأساليب الثابتة الخاص بك آمنًا تلقائيًا؟أم أن الأمر متروك للمطور؟

شكرا ، جون

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

المحلول

class UsefulStuff {
    object _TheLock = new object { };
    public void UsefulThingNumberOne() {
        lock(_TheLock) {
            //CodeBlockA
        }
    }
    public void UsefulThingNumberTwo() {
        lock(_TheLock) {
            //CodeBlockB
        }
    }
}

ويتم منع CodeBlockA وCodeBlockB من تنفيذ في نفس الوقت في المواضيع المختلفة، لأنهم على حد سواء مقفل على نفسه _TheLock مثيل كائن.

والطرق على _TheLock نفسها تتأثر تماما.

نصائح أخرى

هناك شيء آخر يجب ملاحظته وهو أن المنشئات الثابتة يتم تنفيذها بطريقة آمنة خلال وقت التشغيل.إذا كنت تقوم بإنشاء مفردة وتعلن عنها على النحو التالي:

public class Foo
{
    private static Foo instance = new Foo();

    public static Foo Instance
    {
        get { return instance; }
    }
}

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

ووCLR لا تجعل تلقائيا أساليب ثابتة موضوع آمنة. يجب أن تفعل ذلك بنفسك.

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

لنكون واضحين، القفل (فو) لا "تأمين الكائن فو"، وإنما يكتسب قفل المقترنة مع الكائن فو بحيث مقطع حرج (البيان في بناء "القفل (س) stmt") يعمل فقط عندما يكون موضوع الحالي اكتسب القفل.

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