Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / codereview самописный потокобезопасный stack / 25 сообщений из 120, страница 1 из 5
06.02.2017, 17:59
    #39399496
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
Код: 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
06.02.2017, 18:00
    #39399497
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
сорри
Код: 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
06.02.2017, 18:11
    #39399514
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
И... В чем смысл топика?

Да и вообще, приведенный Вами код работает? Что мне он кажется _ну_крайне_ странным.
...
Рейтинг: 0 / 0
06.02.2017, 18:19
    #39399527
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
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
06.02.2017, 18:23
    #39399532
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
questioner
Код: java
1.
public synchronized

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

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

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

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


Leonid KudryavtsevДа и вообще, приведенный Вами код работает? Что-то мне он кажется _ну_крайне_ странным.
...
Рейтинг: 0 / 0
06.02.2017, 18:41
    #39399552
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
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
06.02.2017, 18:44
    #39399553
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
1. Конструктор не thread safe
2. Сочетание NonBlocking и IterruptedException в интерфейсе это прикольно :o)
3. Ну и вообще с synchronized не интересно
4. Как уже заметили, это самый что ни на есть blocking
...
Рейтинг: 0 / 0
06.02.2017, 18:55
    #39399564
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
На мой IMHO приведенный Вами код stack'а совершенно "странный"
Ваш код который его "проверяет" еще более страннее.

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Код: 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
06.02.2017, 19:19
    #39399584
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
questionerили четко выразить свою мысли Вы не можете.
Выражаюсь четче. На мой взгляд, "Многопоточность" это ОДНОВРЕМЕННОЕ выполнение какого либо кода

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


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

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

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

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

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


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


Можете предложить и другие задания, если они будут лучше я только рад.
...
Рейтинг: 0 / 0
06.02.2017, 23:18
    #39399702
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
codereview самописный потокобезопасный stack
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
Форумы / Java [игнор отключен] [закрыт для гостей] / codereview самописный потокобезопасный stack / 25 сообщений из 120, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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