سؤال

أنا جديد جدا على البرمجة الآمنة للخيط، وكان يتساءل عما إذا كان لدي شيء مثل أدناه، هل سيكون هذا آمنا من الجمود مرة أخرى وتشغيلها؟

public class Foo  
{  
    protected CustomClass[] _mySynchedData = new CustomClass[10];

    public void processData()
    {
        synchronized(_mySynchedData) {
            // ...do stuff with synched variable here
        }
    }
}


public class Bar extends Foo
{

    @Override
    public void processData()
    {
        synchronized(_mySynchedData) {
            // perform extended functionality on synched variable here

            // ...then continue onto parent functionality while keeping synched
            super.processData();
        }
    }
}


Bar testObj = new Bar();

// Deadlock?
testObj.processData();
هل كانت مفيدة؟

المحلول

تعرض التعليمات البرمجية الخاص بك فقط مؤشر ترابط واحد.

مع موضوع واحد فقط، لا توجد طريقة يمكنك الحصول على أي طريق مسدود.

وأضاف:
تدعم لغة Java ما يسمونه رسميا مزامنة reentrant.وبعد إنها تعني أساسا أن مؤشر ترابط واحد يمكن أن يردد قفله يملكه بالفعل.

نصائح أخرى

سؤالك هو ما يحدث عند مزامنة مرتين على نفس الكائن.

الجواب هو: سوف تحقق Java أولا أي ترابط يمتلك الشاشة (وهذا هو بنية البيانات الداخلية التي synchronized يعمل). نظرا لأن خيط المالك هو نفس الخيط الحالي، ستستمر Java.

يمكن أن يحدث الجمود فقط إذا كان لديك شاشان وتحاول قفلها في أوامر مختلفة في مؤشرات ترابط مختلفة.

يدعم القفل الذي اتخذته الكلمة الأساسية المتزامنة Java التعشيش، لذلك لا تخاطر في طريق مسدود عن طريق المزامنة على نفس الكائن عدة مرات في نفس الخيط.

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

يشير الكود الخاص بك حاليا فقط قفل واحد: المرتبط _mySynchedData. وبعد حقيقة أنك تحاول قفله مرتين لا يهم كأقفال في جافا reentrant..

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