|
|
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
cdtyjvНапример, предположим, что у нас есть следующий код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. И вы вызываете method1(). Как будет выглядеть assembly? Может быть так: Код: java 1. 2. А может быть вот так: Код: java 1. 2. // Вызвали метод. Первый способ - стандартный, специфицированный подход к вызову функций. Второй способ - более быстрая вариация, так называемый fastcall, так как быстрее сохранить переменную в регистр, чем записывать ее в стэк. Но в обоих случаях была создана копия волатильной переменной. Это страшно? Нет, ведь мы передаем int в метод, а примитивы передаются в методы по значению. То есть у нас просто напросто нет другого варианта, кроме как скопировать волатильную переменную. Ваш пример ни при чем. В вашем примере чтение волатила происходит однократно - при передаче в функцию. А в функции х уже будет гарантированно непоменян другим потоком, т.к. это уже локальная переменная. Если мы хотим видеть волатильный х, наш "другой вариант": передавать в method2 this и обращаться к полю x обьекта. cdtyjvНо если бы переменная не была волатильной, то во втором случае JVM могла бы попробовать переиспользовать ее из регистра при последующем чтении. А если она волатильна, то такого переиспользования не будет. для конкретно вашего примера - нет. Переиспользование будет, поскольку переменные передаются по значению, а значение не волатильно. Т.е. внутри функции method2 наше "икс" локально, т.е.ни о какой волатильности не может идти речи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2014, 09:48 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
chabapokВаш пример ни при чем. В вашем примере чтение волатила происходит однократно - при передаче в функцию. А в функции х уже будет гарантированно непоменян другим потоком, т.к. это уже локальная переменная. Если мы хотим видеть волатильный х, наш "другой вариант": передавать в method2 this и обращаться к полю x обьекта.Мой пример - опровержение моего же тезиса о том, что "волатильные переменные не сохраняются в регистрах". Сохраняются. chabapokдля конкретно вашего примера - нет. Переиспользование будет, поскольку переменные передаются по значению, а значение не волатильно. Т.е. внутри функции method2 наше "икс" локально, т.е.ни о какой волатильности не может идти речи.Я имел ввиду следующий сценарий переиспользования: Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2014, 10:17 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
cdtyjvНичего не разрушено ... так как в вашем примере многопоточная семантика изначально была некорректнойПравильно, некорректной. Что плавно подводит к другой мысли: задолго до того, как нас начнут мучать особенности поведения изменчивых переменных - мы должны научиться писАть многопоточный код, который корректен в принципе . Т.е. снова - ну вот нахрена все эти домыслы об устройстве процессора, если к созданию корректного кода это не приближает ни на шаг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2014, 10:58 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovну вот нахрена все эти домыслы об устройстве процессораДля понимания разницы между данными, которые находятся в основной памяти (актуальные) и в кэше (возможно "устаревшие"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2014, 06:17 |
|
||
|
Concurrency Vs multithreading
|
|||
|---|---|---|---|
|
#18+
UsmanДля понимания разницы между данными, которые находятся в основной памяти (актуальные) и в кэше (возможно "устаревшие").Зачем требуется понимание этой разницы, если простая оптимизация может использовать (регистровую) переменную которая "уже устарела"? Или даже так: зачем требуется объяснять детали устройства аппаратуры, если точность такого объяснения сомнительна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2014, 06:51 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38688557&tid=2126936]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
221ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 577ms |

| 0 / 0 |
