powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / codereview самописный потокобезопасный stack
25 сообщений из 120, страница 4 из 5
codereview самописный потокобезопасный stack
    #39400459
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892questioner, ну, что, придумал как написать size()?))

так наверное:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public int size() {
        do {
            Entry<E> oldPointer = pointer.get();
            Entry<E> entry = oldPointer;
            int size = 0;
            while (entry != null) {
                size++;
                entry = entry.prev;
            }
            if (pointer.compareAndSet(oldPointer, oldPointer)) {
                return size;
            }
        } while (true);
    }
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400466
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хотя cas операция тут как-то ни к селу ни к городу. обычный if можно написать. Меня чего-то терзают смутные сомнения в нужности cas в данном случае
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400483
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerМеня чего-то терзают смутные сомнения в нужности cas в данном случае
Забей. size() вполне может устареть к моменту возврата результата.
Тут важно гарантировать, что цепочка не порвется или еще хуже -сама замкнется, пока по ней бегут.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400503
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевquestionerМеня чего-то терзают смутные сомнения в нужности cas в данном случае
Забей. size() вполне может устареть к моменту возврата результата.
Тут важно гарантировать, что цепочка не порвется или еще хуже -сама замкнется, пока по ней бегут.

Хм, тогда мой вариант совсем не будет работать.

Тогда либо как-то(не знаю как) лочить коллекцию целиком на время исполнения метода, либо держать atomicLong который будет трекать pop/push. Но опять же данные могут быть слегка неконсистентные.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400548
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Реализация метода size() в SynchronizedCollection<E> :
Код: java
1.
2.
3.
public int size() {
    synchronized (mutex) {return c.size();}
}


P.S.
SynchronizedCollection<E> - synchronized-обертка на обычной коллекцией.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400604
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

В Synchronizedxxx все методы синхронизированы, поэтому и работать будет, а тут ведь просят для неблокирубщего алгоритма, тут скорее надо смотреть в сторону CHM
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400605
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Но тогда можно пользоваться только синхро коллекцией. А в чем смысл?


questioner,
Но поскольку Entry не меняются после добавления в стек, даже при извлечении объекта из стека, то цепочка не разорвется. Даже если извлечения обгонят size(). И потому, что size() будет их удерживать их не соберет GC.
Единственное но - при многопоточной работе, size() всегда имеет справочный характер и может устареть в любой момент, в т.ч. до возврата результата.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400610
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочешь задачку?

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

Но тогда можно пользоваться только синхро коллекцией. А в чем смысл?


questioner,
Но поскольку Entry не меняются после добавления в стек, даже при извлечении объекта из стека, то цепочка не разорвется. Даже если извлечения обгонят size(). И потому, что size() будет их удерживать их не соберет GC.
Единственное но - при многопоточной работе, size() всегда имеет справочный характер и может устареть в любой момент, в т.ч. до возврата результата.

Кстати да, при таком подходе, объекты не будут удаляться из памяти. Memory leak. OutOfMemory может быть
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400635
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Почему же? Всю цепочку держит голова. Как она спускается по цепочке - объект становится собираемым.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400697
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевquestioner,

Почему же? Всю цепочку держит голова. Как она спускается по цепочке - объект становится собираемым.

Хм, действительно
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400702
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner
Хм, действительно

Ну что, пора уже к Art of Multiprocessor programming приступать?:) Эта книга сложная но must-read. Ну и упражнений там куча
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400855
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевХочешь задачку?

Сделать аналогичный "стек", позволяющий вынуть как одно, так и два значения подряд.

Как он должен себя если просят вынуть два значения, а есть только одно?
в каком формате их выплёвывать? в массиве?
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400868
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВ Synchronizedxxx все методы синхронизированы, поэтому и работать будет, а тут ведь просят для неблокирубщего алгоритмаСергей АрсеньевНо тогда можно пользоваться только синхро коллекцией. А в чем смысл?Ок. Можно завести одну переменную, которая и будет хранить общее кол-во элементов. Увеличивать при добавлении, уменьшать при удалении и т.д.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400940
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanОк. Можно завести одну переменную, которая и будет хранить общее кол-во элементов. Увеличивать при добавлении, уменьшать при удалении и т.д.

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1249068&msg=20190919 ..... либо держать atomicLong который будет трекать pop/push. Но опять же данные могут быть слегка неконсистентные.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400945
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНо опять же данные могут быть слегка неконсистентные.это зависит от реализации pop/push
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400987
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanquestionerНо опять же данные могут быть слегка неконсистентные.это зависит от реализации pop/push
Но в любом случае, если не запретить эти операции до запроса, результат может быть не актуальным.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39400995
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевUsmanпропущено...
это зависит от реализации pop/push
Но в любом случае, если не запретить эти операции до запроса, результат может быть не актуальным.В отличии от чтения, запись всегда должна быть блокирующей.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39401004
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Мы про подсчет количества? Еще раз повторю - если не запретить изменения результат может быть не актуален чуть ранее чем известен.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39401013
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

Поясните разницу между блокировкой и запретом?
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39401066
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Синонимы. Я про то, что блокировку надо ставить тогда до начала size() и не отменять, пока результат не будет применен. А этого тут хотели бы избежать. :)
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39401080
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевблокировку надо ставить тогда до начала size() и не отменять, пока результат не будет применен. А этого тут хотели бы избежать. :)Только в том случае, если подсчет елементов будет непосредственно внутри метода size().

Сергей Арсеньев, http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1249068&msg=20190919 atomicLong который будет трекать pop/pushА как на счет такого?
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39401122
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanСергей Арсеньевблокировку надо ставить тогда до начала size() и не отменять, пока результат не будет применен. А этого тут хотели бы избежать. :)Только в том случае, если подсчет елементов будет непосредственно внутри метода size().

Сергей Арсеньев, http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1249068&msg=20190919 atomicLong который будет трекать pop/pushА как на счет такого?
ну так мы сможем этот atomicLong инкрементить только уже после того, как compareAndSet сработал. и соответственно действие будет не атомарно
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39401137
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerну так мы сможем этот atomicLong инкрементить только уже после того, как compareAndSet сработал. и соответственно действие будет не атомарноИсхожу из этого:UsmanВ отличии от чтения, запись всегда должна быть блокирующей.
...
Рейтинг: 0 / 0
codereview самописный потокобезопасный stack
    #39401171
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanТолько в том случае, если подсчет елементов будет непосредственно внутри метода size().
Это не важно. В любой момент в том числе и в момент возврата из метода size() ситуация может измениться и число будет не актуально. И даже раньше. К тому моменту, как любой счетчик вернет значение, оно уже может устареть. Поэтому либо полная остановка изменяющих нитей, либо не актуальность.
...
Рейтинг: 0 / 0
25 сообщений из 120, страница 4 из 5
Форумы / Java [игнор отключен] [закрыт для гостей] / codereview самописный потокобезопасный stack
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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