powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / codereview самописный потокобезопасный stack
25 сообщений из 120, страница 1 из 5
codereview самописный потокобезопасный stack
    #39399496
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
37.
38.
39.
40.
41.
42.
43.
public interface MyNonBlockingStack<T> {
    void put(T t) throws InterruptedException;

    T poll() throws InterruptedException;
}

class MyNonBlockingStackImpl<T> implements MyNonBlockingStack<T> {

    private Object internalMonitor = new Object();
    private List<T> list = new ArrayList<>();
    private int maxSize;

    public MyNonBlockingStackImpl(int maxSize) {
        this.maxSize = maxSize;
    }

    @Override
    public synchronized void put(T t) throws InterruptedException {
        while (maxSize <= list.size()) {
            System.out.println("wait put by " + Thread.currentThread().getId());
            wait();
            System.out.println("wait put by " + Thread.currentThread().getId());

        }
        list.add(t);
        notify();

    }

    @Override
    public synchronized T poll() throws InterruptedException {
        while (list.size() == 0) {
            System.out.println("wait read by " + Thread.currentThread().getId());
            wait();
            System.out.println("woken up read by " + Thread.currentThread().getId());

        }
        T t = list.get(list.size()-1);
        list.remove(t);
        notify();
        return t;
    }
}
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399497
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сорри
Код: 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.
class MyNonBlockingStackImpl<T> implements MyNonBlockingStack<T> {

    private List<T> list = new ArrayList<>();
    private int maxSize;

    public MyNonBlockingStackImpl(int maxSize) {
        this.maxSize = maxSize;
    }

    @Override
    public synchronized void put(T t) throws InterruptedException {
        while (maxSize <= list.size()) {
            wait();
        }
        list.add(t);
        notify();

    }

    @Override
    public synchronized T poll() throws InterruptedException {
        while (list.size() == 0) {
            wait();
        }
        T t = list.get(list.size()-1);
        list.remove(t);
        notify();
        return t;
    }
}
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399514
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И... В чем смысл топика?

Да и вообще, приведенный Вами код работает? Что мне он кажется _ну_крайне_ странным.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399527
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevИ... В чем смысл топика?

Да и вообще, приведенный Вами код работает? Что мне он кажется _ну_крайне_ странным.

потренироваться писать многопоточный код)

Код: 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.
37.
38.
39.
class Main {
    public static void main(String[] args) throws InterruptedException {
        MyNonBlockingStackImpl<Integer> myNonBlockingStack = new MyNonBlockingStackImpl<>(5);

        for (int i = 0; i < 10; i++) {
            final int currentValue = i;
            //writer
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        myNonBlockingStack.put(currentValue);
                        //System.out.println("Put " + currentValue + " by " + Thread.currentThread().getId());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        Thread.sleep(5000);
        for (int i = 0; i < 10; i++) {
            //reader
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // System.out.println("Read " +
                        myNonBlockingStack.poll();
                        //         + " by " + Thread.currentThread().getId());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
            Thread.sleep(10);
        }

    }
}



я добавил логов и вроде всё работает. только он конечно blocking, название кривое.

Собсно с учетом отсутвия опыта написания многопоточнго кода в продакшене и возникла мысль показать что есть тут. Вдруг будет аргументированная критика.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399532
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner
Код: java
1.
public synchronized

а как же тонкая оптимизация с использованием volatile -переменных?
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399535
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usmanquestioner
Код: java
1.
public synchronized

а как же тонкая оптимизация с использованием volatile -переменных?

Ок, попробую написать ещё и неблокирующий алгоритм.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399539
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я только не понял, нафига там куча wait и notify. Нафига оно надо и что оно должно было делать.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399546
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevЯ только не понял, нафига там куча wait и notify. Нафига оно надо и что оно должно было делать.

1. Чтобы поток подвис до появления значения в очереди пока она пустая
2. Если очередь переполнена, то ждём пока освободится место
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399550
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner1. Чтобы поток подвис до появления значения в очереди пока она пустая
2. Если очередь переполнена, то ждём пока освободится место


Leonid KudryavtsevДа и вообще, приведенный Вами код работает? Что-то мне он кажется _ну_крайне_ странным.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399552
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Код: 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.
37.
38.
39.
class Main {
    public static void main(String[] args) throws InterruptedException {
        BlockingConcurrentStack<Integer> myNonBlockingStack = new BlockingConcurrentStack<>(5);

        for (int i = 0; i < 10; i++) {
            final int currentValue = i;
            //writer
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        myNonBlockingStack.put(currentValue);
                        //System.out.println("Put " + currentValue + " by " + Thread.currentThread().getId());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        Thread.sleep(5000);
        for (int i = 0; i < 10; i++) {
            //reader
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // System.out.println("Read " +
                        myNonBlockingStack.poll();
                        //         + " by " + Thread.currentThread().getId());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
            Thread.sleep(10);
        }

    }
}



можете запустить.

Но конечно это не значит, что код всегда корректно работает.

А что конкретно не нравится то? а то без аргументов хейтить это неконструктивно
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399553
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Конструктор не thread safe
2. Сочетание NonBlocking и IterruptedException в интерфейсе это прикольно :o)
3. Ну и вообще с synchronized не интересно
4. Как уже заметили, это самый что ни на есть blocking
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399564
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой IMHO приведенный Вами код stack'а совершенно "странный"
Ваш код который его "проверяет" еще более страннее.

Складывается впечатление, что Вы вообще не знаете значения слова "многопотоковость" и "многопоточное выполнение" в практическом его смысле. Обсуждать при этом такие слова как "потокобезопасность" даже страшно.

Т.ч., что тут критиковать, я даже не знаю.

questionerможете запустить.

Не собираюсь. Банально лениво. Всякий мусор на компьютере запускать.

Да и зачем? Где тут многопоточное выполнение? Что этот код делает?
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399569
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevГде тут многопоточное выполнение?
А не, беру свои слова обратно. "Многопоточность" тут конечно есть, частично. Но именно, что частично.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399571
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevНа мой IMHO приведенный Вами код stack'а совершенно "странный"
Ваш код который его "проверяет" еще более страннее.

Складывается впечатление, что Вы вообще не знаете значения слова "многопотоковость" и "многопоточное выполнение" в практическом его смысле. Обсуждать при этом такие слова как "потокобезопасность" даже страшно.

Т.ч., что тут критиковать, я даже не знаю.

questionerможете запустить.

Не собираюсь. Банально лениво. Всякий мусор на компьютере запускать.

Да и зачем? Где тут многопоточное выполнение? Что этот код делает?

складывается впечатление, что Вам просто поворчать не на кого)

или четко выразить свою мысли Вы не можете.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399575
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no568921. Конструктор не thread safe
2. Сочетание NonBlocking и IterruptedException в интерфейсе это прикольно :o)
3. Ну и вообще с synchronized не интересно
4. Как уже заметили, это самый что ни на есть blocking


Вот это аргументированная критика.

no568921. Конструктор не thread safe
что конкретно не так с конструктором? какие проблемы могут быть?

мне кажется synchronized даёт все необходимые гарантии
no568922. Сочетание NonBlocking и IterruptedException в интерфейсе это прикольно :o)

всё-таки это Blocking конечно
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399576
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Ну тут можно юзать ReadWriteLock явно, но мне это уже неинтересно.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399581
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы не было разночтений с именами - последняя версия:

Код: 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.
37.
38.
39.
40.
public interface ConcurrentStack<T> {
    void put(T t) throws InterruptedException;

    T poll() throws InterruptedException;
}

class BlockingConcurrentStack<T> implements ConcurrentStack<T> {

    private List<T> list = new ArrayList<>();
    private int maxSize;

    public BlockingConcurrentStack(int maxSize) {
        this.maxSize = maxSize;
    }

    @Override
    public synchronized void put(T t) throws InterruptedException {
        while (maxSize <= list.size()) {
            //System.out.println("wait Put " + t + " by " + Thread.currentThread().getId());
            wait();
        }
        list.add(t);
        System.out.println("Put " + t + " by " + Thread.currentThread().getId());
        notify();

    }

    @Override
    public synchronized T poll() throws InterruptedException {
        while (list.size() == 0) {
            //System.out.println("wait poll " + " by " + Thread.currentThread().getId());
            wait();
        }
        T t = list.get(list.size() - 1);
        list.remove(t);
        System.out.println("Read " + t + " by " + Thread.currentThread().getId());
        notify();
        return t;
    }
}
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399584
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerили четко выразить свою мысли Вы не можете.
Выражаюсь четче. На мой взгляд, "Многопоточность" это ОДНОВРЕМЕННОЕ выполнение какого либо кода

Если уж Вы пишите проверку для своей поделки, то хорошо, было бы, если бы она "многопоточность" и проверяла. Особенно, если Вы уверяете:
1. Чтобы поток подвис до появления значения в очереди пока она пустая
2. Если очередь переполнена, то ждём пока освободится место


В общем, проверьте ситуацию, когда один поток вставляет данные, а другой ОДНОВРЕМЕННО их оттуда считывает. Да при этом, что бы и проявлялась ситуация описанная Вами же. Пока, наблюдается совершенно странный полуторно-поточный тестовый код.

ПОСЛЕДОВАТЕЛЬНО:
1. Добавляющий данные в коллекцию (тут правда, хоть что-то многопоточное присудствует)
2. ПОСЛЕДОВАТЕЛЬНО (т.к. Вы зачем-то sleep внутрь цикла вставили) считывающий данные из коллекции.

На что встречный вопрос: где в Вашем коде проверки хоть какая-то адекватная многопоточность? И что тут можно обсуждать?
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399588
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

такой вариант я тоже проверял, работает. последний раз немного модифицировал код, чтобы удостовериться, что если очередь переполнена, то значения никуда не пропадают
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399593
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати неблокирующий вариант возможен с обычным List ?
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399609
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моим наблюдениям это самая вредная ошибка плохих программистов. Не то, что они программируют плохо, а что они программируют то, что не надо программировать. Обсуждать тут нечего.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399620
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerКстати неблокирующий вариант возможен с обычным List ?
Код: java
1.
List list = Collections.synchronizedList(...);
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399648
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Насчет wait/notify, это я ошибся. Сорри.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399674
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Partisan MПо моим наблюдениям это самая вредная ошибка плохих программистов. Не то, что они программируют плохо, а что они программируют то, что не надо программировать. Обсуждать тут нечего.
Это задание просто потренироваться. Говорю же нет опыта написания в проде многопоточнго кода.


Я пишу это не потому, что мне очередь нужна, а потому, что мне нужен навык.


Можете предложить и другие задания, если они будут лучше я только рад.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39399702
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanquestionerКстати неблокирующий вариант возможен с обычным List ?
Код: java
1.
List list = Collections.synchronizedList(...);



ну а что если так:

Код: 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.
    volatile AtomicBoolean isReading = new AtomicBoolean(false);
    volatile AtomicBoolean isWriting = new AtomicBoolean(false);

    @Override // non-blocking
    public boolean offer(T t) {
        if (isReading.compareAndSet(false, true)) {
            if (isWriting.compareAndSet(false, true)) {

                if (list.size() >= maxSize) {
                    return false;
                }
                boolean addResult = list.add(t);
                isWriting.set(false);
                isReading.set(false);
                return addResult;
            }
            isReading.set(false);
        }
        return false;
    }

    @Override // non-blocking
    public T take() {
        if (isReading.compareAndSet(false, true)) {
            T t = list.get(list.size() - 1);
            isReading.set(false);
            return t;
        }
        return null;
    }
...
Рейтинг: 0 / 0
25 сообщений из 120, страница 1 из 5
Форумы / Java [игнор отключен] [закрыт для гостей] / codereview самописный потокобезопасный stack
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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