الجمود على إشارة جافا واحدة؟
-
05-07-2019 - |
سؤال
في إحدى إجاباتي الأخيرة، أعطى <م> نظرية م> سبيل المثال عمود الاشارة لتقييد الوصول إلى موارد الذاكرة:
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
لتجنب التسريبات ...
لا تنتمي إلى StackOverflow