Size: a a a

2020 July 04

AM

Aleksander Melnichni... in pro.jvm
Oleg
чтобы зафлашить изменения из одного процессора в другой безопасно
У меня вопрос. А вот все обсуждение выше, нельзя заменить каким-нибудь AtomicIntegerArray и не парится, так как гарантии volatile там будут соблюдаться
источник

DP

Denis Pavlyuchenko in pro.jvm
Aleksander Melnichnikov
У меня вопрос. А вот все обсуждение выше, нельзя заменить каким-нибудь AtomicIntegerArray и не парится, так как гарантии volatile там будут соблюдаться
разве это не будет медленнее? так как теперь мы будем работать с каждым элементом массива, как с volatile
источник

AM

Aleksander Melnichni... in pro.jvm
Denis Pavlyuchenko
разве это не будет медленнее? так как теперь мы будем работать с каждым элементом массива, как с volatile
Будет конечно
источник

VP

Vladimir Petrakovich in pro.jvm
Aleksander Melnichnikov
У меня вопрос. А вот все обсуждение выше, нельзя заменить каким-нибудь AtomicIntegerArray и не парится, так как гарантии volatile там будут соблюдаться
Если потоки будут параллельно работать над одними частями массива, хотя это не задумывалось, там и volatile не поможет
источник

VP

Vladimir Petrakovich in pro.jvm
А если нет, то логично же узнать, можно ли так делать безопасно, а не подстилать солому везде
источник

AM

Aleksander Melnichni... in pro.jvm
Vladimir Petrakovich
Если потоки будут параллельно работать над одними частями массива, хотя это не задумывалось, там и volatile не поможет
Справедливо. Ну, атомик то поможет. Если есть логика, и её нужно атомарно применить.
источник

AM

Aleksander Melnichni... in pro.jvm
Я тоже пожалуй тогда вброшу немного, раз сегодня говорим о многопоточности. Есть такой метод у атомиков lazySet(). Судя по документации - он не допускает реордеринга операций при записи, но не гарантирует строгую видимость как volatile write. Так вот, наткнулся на него, пару лет назад когда дебажил очередную реактивную либу, вопрос: какие оптимизации на основе него можно делать? При условии что в другом потоке обновленное значение все равно не будет гарантировано видно сразу( не понятно, как это можно использовать) ?
Банально например чтобы в такой ситуации:
int x = 0;
AtomicInteger aX = new AtomicInteger(0);
x = 1;
aX.lazySet(1);
не прочитать x = 0, если прочли, что aX = 1;
А если прочитали aX = 0, то х либо 0 либо 1.
источник

А

Артём Курилко... in pro.jvm
Alexandr Emelyanov
Нет, равнозначно
но консольное приложение работает локально
источник

A

Anton in pro.jvm
Артём Курилко
но консольное приложение работает локально
Консольное приложение так же может работать в Docker контейнере, называясь сервисом.
Сначала стоит определить от какого имено типа опасности нужно защититься, из какого источника она должна исходить, с какой вероятностью.
Затем выбирать методы защиты уже в разрезе аспектов безопасности.

Иначе вопрос похож на сравнение безопасности авиаперелетов по сравнению с автотранспортом - везде свои аспекты опасности, статистика и стоимость защиты.
источник

AE

Alexandr Emelyanov in pro.jvm
Артём Курилко
но консольное приложение работает локально
Браузер тоже локально
источник

AS

Aleksey Shipilev in pro.jvm
Aleksander Melnichnikov
Я тоже пожалуй тогда вброшу немного, раз сегодня говорим о многопоточности. Есть такой метод у атомиков lazySet(). Судя по документации - он не допускает реордеринга операций при записи, но не гарантирует строгую видимость как volatile write. Так вот, наткнулся на него, пару лет назад когда дебажил очередную реактивную либу, вопрос: какие оптимизации на основе него можно делать? При условии что в другом потоке обновленное значение все равно не будет гарантировано видно сразу( не понятно, как это можно использовать) ?
Банально например чтобы в такой ситуации:
int x = 0;
AtomicInteger aX = new AtomicInteger(0);
x = 1;
aX.lazySet(1);
не прочитать x = 0, если прочли, что aX = 1;
А если прочитали aX = 0, то х либо 0 либо 1.
lazySet -- это то, что везде называется "release", например, VarHandle.setRelease. Поэтому ваш пример работает как надо. Единственное, что он не гарантирует (т.е. слабее чем volatile) -- это глобальный консенсус. См. "Release-Acquire (RA)" здесь: http://gee.cs.oswego.edu/dl/html/j9mm.html
источник

AM

Aleksander Melnichni... in pro.jvm
Aleksey Shipilev
lazySet -- это то, что везде называется "release", например, VarHandle.setRelease. Поэтому ваш пример работает как надо. Единственное, что он не гарантирует (т.е. слабее чем volatile) -- это глобальный консенсус. См. "Release-Acquire (RA)" здесь: http://gee.cs.oswego.edu/dl/html/j9mm.html
Ага спасибо, ознакомлюсь. У меня банальное непонимание, что это мне дает как разработчику и как я это могу применять. Кажется, что 99.99 процентов задач требуют гарантий как у volatile, не меньше.
источник

AS

Aleksey Shipilev in pro.jvm
Прочитайте ссылку выше. У нас тут куда ни плюнь, SPMC/SPSC-очереди и подобное барахло, которым нужен только RA, а volatile -- как бы и нет.
источник

AM

Aleksander Melnichni... in pro.jvm
Aleksey Shipilev
Прочитайте ссылку выше. У нас тут куда ни плюнь, SPMC/SPSC-очереди и подобное барахло, которым нужен только RA, а volatile -- как бы и нет.
Да, спасибо - почитаю. Я понимаю, что это вопрос скорее про оптимизации в красной зоне - которые требует очень много усилий и знаний, чтобы их делать, но дают малый процент прироста.
источник

AS

Aleksey Shipilev in pro.jvm
Для SP?C очередей получается вполне вменяемый прирост при однострочном изменении, за то lazySet и любят...
источник

A

Aleksandr in pro.jvm
Добрый вечер.

Может кто уже сталкивался с проблемой. Правда возможно, что немного не по теме этой конфы.

Читаю книжку (https://books.google.ru/books/about/Designing_Distributed_Systems.html?id=5hJNDwAAQBAJ&source=kp_cover&redir_esc=y), там в общем есть пример, где показывают sidecar, который можно запустить как докер контейнер к своему существующему. Решил в общем повторить. Сама глава доступка тут (https://joostvdg.github.io/swe/distributed/)

Беру и создаю докерфайл для spring boot приложения

FROM maven:3.5.2-jdk-8-alpine AS MAVEN_BUILD
ARG SPRING_ACTIVE_PROFILE
MAINTAINER Aleksandr
COPY pom.xml /build/
COPY src /build/src/
WORKDIR /build/
RUN mvn clean install -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE && mvn package -B -e -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE
FROM openjdk:8-alpine
WORKDIR /app
COPY --from=MAVEN_BUILD /build/target/task-0.0.1-SNAPSHOT.jar /app/task-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "task-0.0.1-SNAPSHOT.jar"]


Потом создаю контейнер и запускаю его:
$ docker build .

$ docker container run -p 8010:8010 -d <imageId>

-d флаг позволяет мне получить хэш (например cc82fa748a62de634893f5594a334ada2854f0be0dff8149efb28ae67c98191c).

Ну и наконец завожу всё это добро примером из книжки:
docker run -pid=container:cc82fa748a62de634893f5594a334ada2854f0be0dff8149efb28ae67c98191c -p 8080:8080 brendanburns/topz:db0fa58 /server --addr=0.0.0.0:8080


не заводится:
docker: invalid publish opts format (should be name=value but got '8080:8080').


Не подскажите где накосячил?
источник

AG

Alexey Genus in pro.jvm
Должно быть --pid (потерялся один символ -)
источник

A

Aleksandr in pro.jvm
Да и вообще интересно, на сколько адекватно использовать в проде сайдкары, которые собирают метрики по использованию CPU и памяти
источник

A

Aleksandr in pro.jvm
Alexey Genus
Должно быть --pid (потерялся один символ -)
Точно, ужас, позор мне
источник

AG

Alexey Genus in pro.jvm
Да бывает, что уж там)
источник