القفل التلقائي في جافا - كيف؟
-
02-07-2019 - |
سؤال
ما هي أفضل طريقة لتحرير الموارد (في هذه الحالة فتح ReadWriteLock) عند مغادرة النطاق؟كيفية تغطية جميع الطرق الممكنة (العودة، الاستراحة، الاستثناءات، الخ)؟
المحلول
يعد حظر المحاولة/الأخير هو أقرب شيء يمكنك الوصول إليه لهذا السلوك:
Lock l = new Lock();
l.lock(); // Call the lock before calling try.
try {
// Do some processing.
// All code must go in here including break, return etc.
return something;
} finally {
l.unlock();
}
نصائح أخرى
كما قال مايك، يجب أن تكون الكتلة النهائية هي اختيارك.انظر أخيرا منع البرنامج التعليمي, ، حيث ورد:
الكتلة أخيرا دائماً ينفذ عندما يخرج كتلة المحاولة.هذا يضمن تنفيذ الكتلة أخيرًا حتى في حالة حدوث استثناء غير متوقع.
الطريقة الأفضل للقيام بذلك هي استخدام عبارة Try-with-resources، والتي تتيح لك محاكاة لغة C++ آلية رايي:
public class MutexTests {
static class Autolock implements AutoCloseable {
Autolock(ReentrantLock lock) {
this.mLock = lock;
mLock.lock();
}
@Override
public void close() {
mLock.unlock();
}
private final ReentrantLock mLock;
}
public static void main(String[] args) throws InterruptedException {
final ReentrantLock lock = new ReentrantLock();
try (Autolock alock = new Autolock(lock)) {
// Whatever you need to do while you own the lock
}
// Here, you have already released the lock, regardless of exceptions
}
}
لا تنتمي إلى StackOverflow