Описание тега memory-visibility

2 ответа

Изменчивые переменные и другие переменные

Следующее из классической Concurency in Practice: Когда поток A записывает в переменную volatile и впоследствии поток B читает ту же самую переменную, значения всех переменных, которые были видны A до записи в переменную volatile, становятся видимым…
1 ответ

С ++11 атомика. visibility и thread.join() / правильный способ остановить поток

За что (если есть?) STORE_ORDER & LOAD_ORDER C++11 гарантирует, что этот код выполняется за конечное время? std::atomic<bool> a{false}; std::thread t{[&]{ while(!a.load(LOAD_ORDER)); }}; a.store(true, STORE_ORDER); t.join(); Я вижу две про…
3 ответа

Volatile массив - видимость элементов памяти

Рассмотрим фрагмент кода class A { private Map<String, Object> taskMap = new HashMap<>(); private volatile Object[] tasksArray ; // assume this happens on thread1 public void assignTasks() { synchronized(taskMap){ // put new tasks into m…
5 ответов

Несинхронизированное чтение целочисленного потока безопасно в Java?

Я вижу этот код довольно часто в некоторых модульных тестах OSS, но безопасен ли он для потоков? Гарантирован ли цикл while правильное значение invoc? Если нет; ботаник указывает на того, кто знает, на какой архитектуре ЦП это может произойти. priva…
1 ответ

Использование volatile для обеспечения видимости общих (но не одновременных) данных в Java

Я пытаюсь реализовать быструю версию LZ77, и у меня есть вопрос к параллельному программированию. Сейчас у меня есть final byte[] buffer и final int[] resultHolderоба одинаковой длины. Программа делает следующее: Основной поток записывает весь буфер…
0 ответов

Как продемонстрировать проблемы видимости памяти в Go?

Я делаю презентацию о модели памяти Go. Модель памяти гласит, что без отношения "до и после" между записью в одной процедуре и чтением в другой, нет никакой гарантии, что читатель увидит это изменение. Чтобы оказать большее влияние на аудиторию, вме…
20 янв '19 в 23:42
3 ответа

Java ConcurrentHashMap.computeIfPresent видимость изменения значения

Допустим, у меня есть параллельная карта со значениями коллекций: Map<Integer, List<Integer> map = new ConcurrentHashMap<>(); map.putIfAbsent(8, new ArrayList<>()); и я обновляю значение следующим образом: map.computeIfPresent(8…
1 ответ

Действительно ли изменчивая ссылка действительно гарантирует, что внутреннее состояние объекта видимо другим потокам?

Читая "Параллелизм Java на практике", я обнаружил следующее: Чтобы безопасно опубликовать объект, и ссылка на объект, и состояние объекта должны быть видны другим потокам одновременно. Правильно сконструированный объект может быть безопасно опублико…
24 мар '16 в 13:03
7 ответов

Разделяются ли статические переменные между потоками?

Мой учитель на уроках Java по верхнему уровню сказал что-то, в чем я не был уверен. Он заявил, что следующий код не обязательно обновит ready переменная. По его словам, два потока не обязательно совместно используют статическую переменную, особенно …
2 ответа

Java Concurrent Коллекции и видимость

Я немного не уверен, что ожидать от Concurrent Collections (например, ConcurrentMap) в отношении видимости данных в коллекции. A: Thread1 помещает сложный объект, а Thread2 получает его. Все ли атрибуты будут видны в теме 2? B: Thread1 помещает слож…
1 ответ

Если Поток B хочет видеть изменения, которые вносит Поток A, может ли только последнее изменение быть изменчивой переменной в отличие от всех?

Я посмотрел на этот ответ, и он утверждает, как: Согласно новой модели памяти, когда поток A записывает в энергозависимую переменную V, а поток B читает из V, любые значения переменных, которые были видны A во время записи V, теперь гарантированно б…
2 ответа

Гарантируют ли атомарные переменные видимость памяти?

Небольшой вопрос о видимости памяти. CodeSample1: class CustomLock { private boolean locked = false; public boolean lock() { if(!locked) { locked = true; return true; } return false; } } Этот код склонен к ошибкам в многопоточной среде, во-первых, и…
3 ответа

Неинициализированный объект просочился в другой поток, несмотря на отсутствие явного утечки кода?

Давайте посмотрим на эту простую Java-программу: import java.util.*; class A { static B b; static class B { int x; B(int x) { this.x = x; } } public static void main(String[] args) { new Thread() { void f(B q) { int x = q.x; if (x != 1) { System.out…
0 ответов

Spring и Java видимость

В последнее время наша система испытывает все виды Spring, связанные с "вуду". Обычно это выглядит примерно так: Различные одноэлементные bean-компоненты имеют свойства (ctor) autowired, на основе которых они создают некоторые внутренние структуры д…
2 ответа

Обеспечение видимости памяти с помощью компоновщика / фабричного шаблона

Следующий класс: class Pizza { Ingredients ingredients; Price price; public setIngredients(Ingredients ing) { if (ingredients != null) { throw new IllegalStateException(); } ingredients = ing; return this; } public setPrice(Price p) { if (price != n…
2 ответа

Гарантирует ли BackgroundWorker, что изменения памяти, сделанные в фоновом потоке, становятся видимыми для основного потока?

Если я использую BackgroundWorker для изменения структур данных в моем приложении, есть ли гарантия, что изменения, внесенные в фоновый поток, будут видны основному (UI) потоку после завершения BackgroundWorker (например, в обработчике событий RunWo…
14 ноя '14 в 18:00
0 ответов

Безопасны ли операции перед Thread.start() по отношению к новому потоку?

Существуют ли какие-либо гарантии для переменной видимости и / или порядка инструкций перед Thread.start() по отношению к началу новой темы? В частности, в приведенном ниже минималистическом примере я прав, предполагая, что var должно быть volatile …
2 ответа

Почему эта простая многопоточная программа застревает?

Взгляните на эту простую Java-программу: import java.lang.*; class A { static boolean done; public static void main(String args[]) { done = false; new Thread() { public void run() { try { Thread.sleep(1000); // dummy work load } catch (Exception e) …
2 ответа

Основной поток случайно не достигает конца (пытаясь суммировать натуральные числа в параллельных потоках)

У меня есть следующий код, чтобы найти сумму натуральных чисел от 1 до 5000. Это простое упражнение для практики параллелизма. public static void main(String[] args) throws InterruptedException { final int[] threadNb = new int[] {5}; final Integer[]…
3 ответа

Нужно ли летучее?

Если у меня есть очередь байтов, где, как ожидается, будет один производитель потока, другой потребитель: class ByteQueue{ byte[] buf; /*volatile?*/ int readIdx; /*volatile?*/ int writeIdx; Runnable writeListener; Runnable readListener; // ... void …