Предположим, у меня есть некоторые ресурсы, к которым я хочу синхронизировать доступ. Большинство этих доступов доступны только для чтения. Я хотел бы разрешить доступ только для чтения только за один раз, так как система может обрабатывать. Но я хотел бы, чтобы остановить чтение, сделать некоторые записи, а затем разрешить чтение снова.Какие классы java.util.concurrent позволят мне упорядочивать мои чтения/записи?
Так нити чтения может выглядеть следующим образом
Resource r = null;
readLock.acquire();
r = resources.get();
readLock.release();
Любое количество потоков может сделать это в то же самое время, что не было бы проблемой.
Нити записи будет выглядеть следующим образом:
readLock.acquireOnlyMe(); // waits for all other threads to relase
// all other threads block when they try to acquire
r = resources.get();
r.setData(data);
readLock.release();
Прямо сейчас, я использую ReentrantLock
, который служит в качестве чтения и записи. Но, очевидно, это заставляет чтение работать последовательно, когда я предпочитаю, чтобы они работали одновременно.
Что делать, чтобы решить эту проблему?
Похоже, что это known as the readers-writers problem, а в записи wiki перечислены некоторые реализации C, но для Java нет.
Редактировать: Я открыт для любой библиотеки Java, которая выполнит эту работу. Название говорит java.util.concurrent, потому что кажется, скорее всего, ответ будет лежать там.
Я считаю, что [это] (http://stackoverflow.com/a/6089967/248082) может быть вашим ответом. – nobeh
"в записи wiki перечислены некоторые реализации C, но нет для Java" - а как насчет ReadWriteLock, который он упоминает, был введен в Java 5? – yshavit
Это похоже на то, что я ищу. Я не понимал, что там есть подпакет. Отлично! – corsiKa