![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Нужно сделать "ленивую" инициализацию. Несколько потоков хотят получить доступ к ресурсу. Если ресурс не существует, то первый обратившийся должен запустить запрос на ресурс и ждать результата. Остальные потоки тоже должны ждать. Я это быстро реализовал с блоком synchronized , задумался как назвать, и предположил, что наверняка существует стандартное решение. Что для этого есть в jdk?
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Можно использовать java.util.concurrent.locks.Lock:
хотя здесь можно и synchronized спокойно обойтись. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Как я понял, здесь используется преимущество отсутствия wait() - все потоки, запрашивающие инстанс, будут крутится в бесконечном цикле
пока первый поток не создаст обьект и не отпустит lock. Но это преимущество, очевидно, имеет место только для относительно быстрых операций создания новых обьектов. Если создание обьекта предполагает запрос на сервер или в базу данных, то, возможно, лучше применить wait(). Спасибо за пример! Это сообщение отредактировал(а) COVD - 24.3.2008, 20:19 |
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
На самом деле я перепутал методы, меня смутил перегруженный tryLock(long, TimeUnit). Здесь надо просто
Первый поток который вызовет этот метод захватит блокировку и начнет процесс инициализации. Остальные потоки просто встанут на lock(). Далее первый поток завершает инициализацию и освобождает блокировку. Остальные потоки по очереди получаю блокировку и убеждаются, что объект уже создан и быстро ее освобождают. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Можно использовать ReadWriteLock - оно понятнее и эффективнее. Для чтения блокируют readLock, а для создания - writeLock; блокировка writeLock, естественно, блокирует readLock.
-------------------- ![]() ![]() |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
LSD, спасибо за уточнение. Использование lock() выглядит более традиционным решением.
Добавлено через 6 минут и 15 секунд
w1nd, спасибо за вариант. Я почитал документацию - он действительно хорош, когда заранее известно, кто "писатель", а кто - "читатель". В моей же задаче "писатель" тот, кто первый обращается к ресурсу. С ходу не видно, как его можно прикрутить. |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Почему? Кто заблокировал writeLock - тот и писатель. -------------------- ![]() ![]() |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |