powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Concurrency Vs multithreading
5 сообщений из 130, страница 6 из 6
Concurrency Vs multithreading
    #38688551
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНапример, предположим, что у нас есть следующий код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
volatile int x;

void method1() {
    method2(x);
}

method2(int val) {
   ...;
}



И вы вызываете method1(). Как будет выглядеть assembly? Может быть так:

Код: java
1.
2.
push [x address]; // Записали копию волатильной переменной в стэк.
call method2; // Вызвали метод.


А может быть вот так:

Код: java
1.
2.
mov r11, [x address]; // Сохранили копию волатильной переменной в регистр.
call method2; 

// Вызвали метод.

Первый способ - стандартный, специфицированный подход к вызову функций.
Второй способ - более быстрая вариация, так называемый fastcall, так как быстрее сохранить переменную в регистр, чем записывать ее в стэк.
Но в обоих случаях была создана копия волатильной переменной. Это страшно? Нет, ведь мы передаем int в метод, а примитивы передаются в методы по значению. То есть у нас просто напросто нет другого варианта, кроме как скопировать волатильную переменную.

Ваш пример ни при чем. В вашем примере чтение волатила происходит однократно - при передаче в функцию. А в функции х уже будет гарантированно непоменян другим потоком, т.к. это уже локальная переменная. Если мы хотим видеть волатильный х, наш "другой вариант": передавать в method2 this и обращаться к полю x обьекта.



cdtyjvНо если бы переменная не была волатильной, то во втором случае JVM могла бы попробовать переиспользовать ее из регистра при последующем чтении. А если она волатильна, то такого переиспользования не будет.
для конкретно вашего примера - нет. Переиспользование будет, поскольку переменные передаются по значению, а значение не волатильно. Т.е. внутри функции method2 наше "икс" локально, т.е.ни о какой волатильности не может идти речи.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38688557
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokВаш пример ни при чем. В вашем примере чтение волатила происходит однократно - при передаче в функцию. А в функции х уже будет гарантированно непоменян другим потоком, т.к. это уже локальная переменная. Если мы хотим видеть волатильный х, наш "другой вариант": передавать в method2 this и обращаться к полю x обьекта.Мой пример - опровержение моего же тезиса о том, что "волатильные переменные не сохраняются в регистрах". Сохраняются.

chabapokдля конкретно вашего примера - нет. Переиспользование будет, поскольку переменные передаются по значению, а значение не волатильно. Т.е. внутри функции method2 наше "икс" локально, т.е.ни о какой волатильности не может идти речи.Я имел ввиду следующий сценарий переиспользования:
Код: java
1.
2.
3.
4.
5.
6.
7.
method1() {
    method2(x);

    if (x == ...) { // Второе чтение, x может быть переиспользован из регистра, если не volatile
        ...
    }
}
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38688564
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНичего не разрушено ... так как в вашем примере многопоточная семантика изначально была некорректнойПравильно, некорректной.
Что плавно подводит к другой мысли: задолго до того, как нас начнут мучать особенности поведения изменчивых переменных - мы должны научиться писАть многопоточный код, который корректен в принципе .
Т.е. снова - ну вот нахрена все эти домыслы об устройстве процессора, если к созданию корректного кода это не приближает ни на шаг?
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38688769
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovну вот нахрена все эти домыслы об устройстве процессораДля понимания разницы между данными, которые находятся в основной памяти (актуальные) и в кэше (возможно "устаревшие").
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38688773
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanДля понимания разницы между данными, которые находятся в основной памяти (актуальные) и в кэше (возможно "устаревшие").Зачем требуется понимание этой разницы, если простая оптимизация может использовать (регистровую) переменную которая "уже устарела"?
Или даже так: зачем требуется объяснять детали устройства аппаратуры, если точность такого объяснения сомнительна?
...
Рейтинг: 0 / 0
5 сообщений из 130, страница 6 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / Concurrency Vs multithreading
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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