سؤال

ما هي أفضل طريقة لتحرير الموارد (في هذه الحالة فتح 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

    }

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