سؤال

في إحدى إجاباتي الأخيرة، أعطى <م> نظرية سبيل المثال عمود الاشارة لتقييد الوصول إلى موارد الذاكرة:

public static byte[] createArray(int size) throws InterruptedException {
    semaphore.acquire(size);
    return new byte[size];
}
public static void releaseArray(byte[] array) {
    semaphore.release(array.length);
}

وأعتقد أن هذا يمكن أن تكون مصدرا من الجمود إذا كان التداخل تخصيص سيئة:

semaphore = new Sempaphore(30, true);
// T1                                 T2
//--------------------------          ----------------------
a1 = createArray(10);                                           // 20
                                      a3 = createArray(10);     // 10
a2 = createArray(15);                                           // wait
                                      a4 = createArray(15);     // wait
// ...                                // ...
releaseArray(a1);                     releaseArray(a3);
releaseArray(a2);                     releaseArray(a4);

هل ملاحظتي صحيح؟ إذا كانت الإجابة بنعم، كيف يمكنني تجنب هذا الوضع (على سبيل المثال توقيت الانتظار والتراجع)؟

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

المحلول

نعم، وذلك باستخدام Semaphore.tryAcquire(permits, timeout, timeUnit) سيكون الشيء المعقول القيام به هنا. ومن الواضح أن كنت قد حصلت على أن نكون حذرين للافراج عن الإشارة في كتلة finally لتجنب التسريبات ...

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