2012-04-10 3 views
2

Предположим, у меня есть некоторые ресурсы, к которым я хочу синхронизировать доступ. Большинство этих доступов доступны только для чтения. Я хотел бы разрешить доступ только для чтения только за один раз, так как система может обрабатывать. Но я хотел бы, чтобы остановить чтение, сделать некоторые записи, а затем разрешить чтение снова.Какие классы 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, потому что кажется, скорее всего, ответ будет лежать там.

+1

Я считаю, что [это] (http://stackoverflow.com/a/6089967/248082) может быть вашим ответом. – nobeh

+0

"в записи wiki перечислены некоторые реализации C, но нет для Java" - а как насчет ReadWriteLock, который он упоминает, был введен в Java 5? – yshavit

+0

Это похоже на то, что я ищу. Я не понимал, что там есть подпакет. Отлично! – corsiKa

ответ

2

Если вы хотите ограничить поток писателей одним, то ReentrantReadWriteLock будет вашим человеком.

Для более чем одного - вы, вероятно, захотите заблокировать своих авторов с помощью Семафора. Я рекомендую рассчитывать начальное количество разрешений на количество ядер - возможно, ядер + 1.

 Смежные вопросы

  • Нет связанных вопросов^_^