الآثار الجانبية لرمي استثناء داخل جملة متزامنة؟
-
19-09-2019 - |
سؤال
هل هناك أي آثار جانبية غير واضحة لرمي استثناء من داخل جملة متزامنة؟ ماذا يحدث للقفل؟
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
المحلول
لا أرى أي تأثير جانبي.
ال قفل مضمون ليتم إنهاء في جميع الحالات، واستثناء ليس استثناء (يقصد التورية).
نصائح أخرى
كما نأمل أن يتم إصدار القفل بشكل طبيعي.
للرجوع إليها، القسم المناسب من JLS الذي يضمن هذا السلوك § 14.19:
إذا اكتمال تنفيذ الكتلة بشكل طبيعي، فإن القفل غير مقفلة ويكمل العبارة المتزامنة بشكل طبيعي. في حالة اكتمال تنفيذ الكتلة فجأة لأي سبب من الأسباب، فإن القفل غير مقفلة والبيان المتزامن ثم يكمل فجأة لنفس السبب.
(يتم تحديد "الإنجاز المفاجئ" في مكان آخر في JLS ليشمل استثناءات من JVM، استثناءات مرفوعة throw
, واستخدام break
, continue
, ، أو return
بيانات نقل خارج الكتلة.)
لا تنتمي إلى StackOverflow