powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос в академических целях
19 сообщений из 19, страница 1 из 1
Вопрос в академических целях
    #38804462
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По результатам собеседования, решил озадачиться таки вопросом: написать самый просто пул.
Основная идея что пул ограничен размером и пользователь сам должен следить за возвратом объектов.
Если же все объекты разобраны, то ждём пока кто-то вернёт объект в пул.
Вот что получилось
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
public class PoolWithWait {

    private final Queue<String> queue = new LinkedList<>();

    public PoolWithWait() {
        for (int i = 0; i < 2; i++) {
            queue.add("String"+i);
        }
    }

    public String barrowString() {
        synchronized(queue) {
            while(queue.size()==0) {
                try {
                    System.out.println("waiting... ["+Thread.currentThread().getName()+"]");
                    queue.wait();
                    if(queue.size()!=0) {
                        System.out.println("barrow element after waiting ["+Thread.currentThread().getName()+"]");
                        return queue.poll();
                    }
                } catch (InterruptedException e) {
                    System.out.println("thread interrupted");
                }
            }
            System.out.println("barrow element without waiting ["+Thread.currentThread().getName()+"]");
            return queue.poll();
        }
    }

    public void returnString(String poolElement) {
        synchronized (queue) {
            queue.add(poolElement);
            queue.notifyAll();
        }
    }
}


По тесту работает как задумано. Но возможно есть какие-то фундаментальные ошибки? Первый, так сказать, блин.
Замечания, предложения, советы, приветствуются.

-----
Если дела идут плохо, есть вероятность, что в ближайшее время они пойдут ещё хуже.(с)Мерфи
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804476
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задлянафига все эти многабукав, если существует j.u.c.ArrayBlockingQueue ???
Кроме того, ждать возврата соединений в пустой пул - плохая идея: вместо того, чтобы выдать предупреждение, которое сможет увидеть администратор системы, мы тормозим работу клиентов без всякой диагностики.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804538
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, ещё о фундаментальных ошибках: synchronized - критическая секция.
Ввод-вывод в критической секции - плохая идея: выставили (под)отчётные флаги, вышли из секции и отчитались о проделанной работе.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804543
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем цикл while и вторая проверка на размер очереди?
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804551
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiver,

InterruptedException, разве не должен выходить из цикла?
barrow это "тележка" ?
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804554
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А зачем цикл while и вторая проверка на размер очереди?
Потому что wait всегда нужно оборачивать в логическое условие. Но можно было, конечно, и одним условием обойтись, а не копипастой.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804559
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov ,
вывод это просто для теста, чтобы можно было понять что там происходит. Буду иметь ввиду, спасибо.

Blazkowicz ,
обшибся :( конечно там должно быть borrow
да, с эксепшеном лоханулся.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804568
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А зачем цикл while и вторая проверка на размер очереди?
по while уже ответили, а вторая проверка чисто для "посмотреть логику" что после ожидания тред получил что хотел. По хорошему достаточно и верхнего while.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804703
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiver,

Просто конечно, но
- Пул не проверяет, что вернули то что взяли.
- Пул не проверяет, что один элемент вернули один раз.
- Пул не проверяет взаимную блокировку.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804707
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев - Пул не проверяет взаимную блокировку.
о чем речь?
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804723
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

ThreadA Взял объект
ThreadB Взял объект
ThreadA Хочет взять объект
ThreadB Хочет взять объект

А их, если я не путаю всего 2. :)
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804755
YamahaR1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Побольше бы таких вопросов, всегда узнаешь что-то новое :)
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804805
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевDDiver,

Просто конечно, но
- Пул не проверяет, что вернули то что взяли.
- Пул не проверяет, что один элемент вернули один раз.
- Пул не проверяет взаимную блокировку.
- Первую проблему думаю можно решить используя например две мапа вместо одной очереди, и просто перемещать отданные объекты из мапы свободных в мапу занятых. Если вернут не тот объект, то он не будет найден в мапе отданных и соответственно перемещён обратно в свободные. Хотя наверное есть более изящный способ.
- Мапы также решат и вторую проблему. (При условии что повторная попытка вернуть не будет произведена, после того как объект уже отдан ещё одному потоку) в противном случае ИМХО нужно как-то пристёгивать к объекту какой-либо идентификатор.
- А вот что делать со взаимной блокировкой…

ЗЫ вот так что-то простое и превращается во что-то сложное :)
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804836
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YamahaR1Побольше бы таких вопросов, всегда узнаешь что-то новое :)
от туда же:
как реализовать метод equals при наследовании? переопределять его в наследниках или нет? если переопределять то как?
ответ нашёлся у Джошуа блоха , хотя он же говорит что плохая идея сравнивать разные классы между собой(если ничего не путаю).
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804874
YamahaR1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverYamahaR1Побольше бы таких вопросов, всегда узнаешь что-то новое :)
от туда же:
как реализовать метод equals при наследовании? переопределять его в наследниках или нет? если переопределять то как?
ответ нашёлся у Джошуа блоха , хотя он же говорит что плохая идея сравнивать разные классы между собой(если ничего не путаю).

Вот так вот сходу тяжело сказать, надо читать Блоха :)
Было бы хорошо создать отдельный топик и туда такие задачки постить, помнится коллега Atum таким занимался в свое время...
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38804900
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев - Пул не проверяет, что вернули то что взяли.
- Пул не проверяет, что один элемент вернули один раз.Это всё - проблемы клиента.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38805058
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Клиент может денег не заплатить, или штраф впаять, если программа будет плохо написана.


Кроме того если предположить, что пул динамический и добавляться-удаляться в общий список объекты могут по независимым от получившего процесса обстоятельствам, то это не только проблемы получившего процесса.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38805117
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев Клиент может денег не заплатитьКроме клиентов заказчиков есть "код, использующий нечто". Это тоже клиенты.Кроме того если предположить, что пул динамический и добавляться-удаляться в общий список объекты могут по независимым от получившего процесса обстоятельствам, то это не только проблемы получившего процесса.Ещё раз.
Код, забравший объект из пула, обязан вернуть объект в пул.
Трудности, которые при этом придётся преодолеть программисту, работающему с объектом вне пула - никого не колышут.
...
Рейтинг: 0 / 0
Вопрос в академических целях
    #38806572
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКод, забравший объект из пула, обязан вернуть объект в пул.
Код могли прибить это раз. (кстати строка 4)
Ваша фраза не имеет отношения к проверке того, что тот кто взял возвращает то, что взял, и только один раз. :)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос в академических целях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]