|
|
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Добрый день! Как вы думаете, операция инкремента примитивного типа int атомарна? простой пример: Код: plaintext 1. 2. 3. 4. 5. 6. если на одном и том же экземпляре Thing несколько потоков будут выполнять несинхронизированный метод incT, будут-ли проблемы? или в конечном счете все будет ок и t будет равна суммарному колличеству вызовов? Всегда думал что простые операции над примитивными типами атомарны, но тут задумался и теперь кажется что нет. Так как чтобы инкрементировать значение переменной, как минимум нужно (на разных устройствах конечно по-разному): 1 Из ячейки памяти загрузить ее сначало в регистр 2 Потом этот регистр инкрементировать (вот это точно атомарно!! :)) 3 А потом сохранить обратно Даже при таком раскладе другой поток может вмешаться уже между пунктами 1 и 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 14:31 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Конечно же не атомарна эта оперция. http://download-llnw.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 14:33 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ясненько, спасибо овтет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 16:21 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Нет в JAVA есть только одна атомарная операция, и это операция присваивания, более атомарных операций нет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2012, 21:22 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Операция инкрементування не атомарная, потому что находится ячейка памяти, где есть значение, которое нужно увеличить, затем оно извлекается из данной ячейки памяти инкрементируется и записывается снова в ячейку памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2012, 21:25 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Прошу прощения пост старый, просто искал информацию и попал в этот пост. Вопрос вот в чем: авторНет в JAVA есть только одна атомарная операция, и это операция присваивания, более атомарных операций нет! А если: Код: java 1. 2. 3. 4. 5. 6. 7. 8. Это разве не атомарно ? Ведь каждый Thread при входе в метод создает каждый свой фрейм? И вопрос еще в догонку, можно ли считать инструкции JVM каждую в отдельности - атомарной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 23:08 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
no56892Это разве не атомарно ? Ведь каждый Thread при входе в метод создает каждый свой фрейм? То что переменная объявлена локальной делает её не доступной для других потоков. Но это никак не влияет на атомарность отдельно взятых операций. Метод потокобезопасный, так как он не оперирует критическими ресурсами. Атомарность это свойство отдельных операций, а не методов. no56892И вопрос еще в догонку, можно ли считать инструкции JVM каждую в отдельности - атомарной? Нет. Имеются ввиду инструкции байт-кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 23:47 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНо это никак не влияет на атомарность отдельно взятых операций. Метод потокобезопасный, так как он не оперирует критическими ресурсами Т.е. атомарная операция(ии) всегда имеет(ют) отношение к shared ресурсам? BlazkowiczНет. Имеются ввиду инструкции байт-кода? Ну вот эти . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:09 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
no56892Т.е. атомарная операция(ии) всегда имеет(ют) отношение к shared ресурсам? Нет. Операция это операция. Ресурс это ресурс. Способ использования ресурса никак не валияет на атомарность отдельной взятой операции. no56892Ну вот эти . Таки инструкции байт-кода. Нет, не атомарны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:12 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Blazkowiczno56892Т.е. атомарная операция(ии) всегда имеет(ют) отношение к shared ресурсам? Нет. Операция это операция. Ресурс это ресурс. Способ использования ресурса никак не валияет на атомарность отдельной взятой операции. no56892Ну вот эти . Таки инструкции байт-кода. Нет, не атомарны. Все не атомарны или атомарны, но не все? А где найти определение атомарной операции? Если, например, операция состоит из двух атомарных операций, то она может быть уже не атомарна? Дак ведь недоступна для другого потока (это про инкремент локальной переменной метода), а если допустим, это была бы переменная объекта? и на ней сделать семафор, то во время использования один потоком так же не доступн для всех остальных? Почему она в данном случае не считается атомарной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 18:44 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
no56892 , давайте сначала определимся с терминологией. Есть ресурс - это некая абстрактная сущность, имеющая состояние. Это может быть ячейка памяти, это может быть совокупность ячеек в памяти. Это может быть строка в СУБД, таблица с этой строкой, или вообще вся СУБД. Это может быть объект Java. Это может быть удаленный REST-сервис. И т.д., и т.п. У каждого ресурса есть набор операций , которые можно надним осуществлять. Эти операции по своей сути либо либо читают состояние ресурса, либо изменяют его, либо же делают и то, и другое. Например, для ячейки памяти есть операции store и load. Для СУБД есть транзакции и запросы. Для объекта или REST-сервиса - это методы. И т.д. И т.п. Пусть на ресурсе R определен набор связанных операций {O1, O2 ... OX). Мы говорим, что операция On ресурса R является атомарной, если в процессе ее работы никакая другая операция из множества {O1; ON} не может изменить состояние этого объекта так, что это повлияет на результат операции On. Пример неатомарных операций: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Пример атомарных операций: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Пример двух атомарных операций, которые перестают быть таковыми после того, как появляется op3(): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 19:29 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
cdtyjv Пусть на ресурсе R определен набор связанных операций {O1, O2 ... OX). Мы говорим, что операция On ресурса R является атомарной, если в процессе ее работы никакая другая операция из множества {O1; ON} не может изменить состояние этого объекта так, что это повлияет на результат операции On. Дак инкремент локальной переменной это все-таки тогда атомарная операция или нет? А почему инструкции JVM не атомарны каждая в отдельности? Ведь инкремент (переменной объекта) это: Вытащить значение из heap на стек раз Инкрементировать верхний элемент стека два Значение со стека поместить обратно в heap три ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 19:50 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
no56892 , Перечитайте, что я написал выше. Что бы сказать, является ли конкретная операция атомарной или нет, необходимо: 1) Определить ресурс 2) Определить набор операций на этом ресурсе относительно которых мы будем судить об атомарности рассматриваемой операции. То есть атомарность это относительное понятие. А потому ваш вопрос "атомарен ли инкремент" некорректен в принципе вне контекста. Я вам привел три примера инкремента переменных. Сам инкремент везде одинаков, это просто i++. Но атомарен он только во втором примере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 20:01 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
cdtyjvПеречитайте, что я написал выше. Что бы сказать, является ли конкретная операция атомарной или нет, необходимо: 1) Определить ресурс 2) Определить набор операций на этом ресурсе относительно которых мы будем судить об атомарности рассматриваемой операции. Допустим, есть ячейка памяти и есть регистр процессора. Процессор умеет выполнять арифметические операции только на своих внутренних регистрах, поэтому, чтобы инкрементировать число в данной ячейке ему надо сначало загрузить ее значение в регистр, инкрементировать регистр и положить обратно. Вот допустим ресурс - ячейка памяти и две(запись/чтение)+одна операции. Можно ли сделать вывод об их атомарности на основании этого? Мое предположение если процессор один, то инкремент - атомарная операция, если >=2, то нет, но каждая из этих операций по прежнему остается атомарной. cdtyjvТо есть атомарность это относительное понятие. А потому ваш вопрос "атомарен ли инкремент" некорректен в принципе вне контекста. Я вам привел три примера инкремента переменных. Сам инкремент везде одинаков, это просто i++. Но атомарен он только во втором примере. Но у меня вопрос по поводу инкремента локальной переменной метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 20:18 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
no56892Допустим, есть ячейка памяти и есть регистр процессора. Процессор умеет выполнять арифметические операции только на своих внутренних регистрах, поэтому, чтобы инкрементировать число в данной ячейке ему надо сначало загрузить ее значение в регистр, инкрементировать регистр и положить обратно. Вот допустим ресурс - ячейка памяти и две(запись/чтение)+одна операции. Можно ли сделать вывод об их атомарности на основании этого?Нельзя. no56892Мое предположение если процессор один, то инкремент - атомарная операция, если >=2, то нет, но каждая из этих операций по прежнему остается атомарной.Нет. Вот пример: Т1: Поток 1 считывает i из памяти, она равна 1. Т2: Поток 1 инкрементит до 2 у себя в регистре. Т3: Происходит context switch, поток 1 саспендится, содержимое его регистров сбрасывается во временное хранилище, а в процессор записывается содержимое регистров для потока 2, и этот поток начинает работать. Т4: Поток 2 считывает i из памяти, она равна 1. Т5: Поток 2 инкрементит до 2 у себя в регистре. Т6: Поток записывает в память 2. Т7: Опять context switch, начинает работать первый поток. T8: Поток 1 записывает в память 2. Все, инкремент продолбан, атомарности нет. Мы можем говорить об атомарности по умолчанию, только если мы работаем в однопоточном окружении. Не однопроцессорном, а однопоточном. no56892Но у меня вопрос по поводу инкремента локальной переменной метода?Это не так. В вашем первом сообщении вы привели код, где инкрементируемая переменная не является локальной. Применительно к действительно локальным переменным, понятие атомарности смысла не имеет, так как их может видеть только один поток. Следовательно, все операции над локальными переменными являются атомарными по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 20:27 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
cdtyjvНе однопроцессорном, а однопоточном. Да, я забыл про контекст свитч. cdtyjv Т1: Поток 1 считывает i из памяти, она равна 1. Т2: Поток 1 инкрементит до 2 у себя в регистре. Т3: Происходит context switch, поток 1 саспендится, содержимое его регистров сбрасывается во временное хранилище, а в процессор записывается содержимое регистров для потока 2, и этот поток начинает работать. Т4: Поток 2 считывает i из памяти, она равна 1. Т5: Поток 2 инкрементит до 2 у себя в регистре. Т6: Поток записывает в память 2. Т7: Опять context switch, начинает работать первый поток. T8: Поток 1 записывает в память 2. Ну дак все-таки, А {T1...T8} каждая в отдельности атомарна? И можно ли сделать вывод, что инструкции JVM каждая в отдельности атомарна? И еще микровопросик, пожайлуста!: Код: java 1. 2. 3. В данном случае информация о типе A объекта, созданного new хранится вместе с объектом в heap? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 20:41 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
no56892Ну дак все-таки, А {T1...T8} каждая в отдельности атомарна?В принципе, можно так сказать. Другое дело, что толку от такой атомарности никакого нет. no56892И можно ли сделать вывод, что инструкции JVM каждая в отдельности атомарна?Что такое инструкция JVM? Каждая строчка Java кода статически преобразовывается в какое-то количество инструкций байт-кода, когда вы компилирует есвой код. Каждай инструкция байт-кода, в свою очередь компилируется уже в какое-то количество машинных инструкций. Причем, это происходит динамически, и одна и та же байт-код инструкция может компилироваться в разные машинные команды в зависимости от платформы, JVMки, срабаыватния различных оптимизаций, и т.д.. Поэтому ваш вопрос по сути лишен смысла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 20:51 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
cdtyjv Что такое инструкция JVM? http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5 Вот например есть два потока, каждый из которых в любой момент может выполнить любую из них. Возможно ли, что в каком-то случае "другая операция из множества ... может изменить состояние ..., что это повлияет на результат операции" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 21:04 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
no56892, Странно в этом тысячилетии...в ЯП..высокого уровня говорить про регистры и атомы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 21:36 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Petro123no56892, Странно в этом тысячилетии...в ЯП..высокого уровня говорить про регистры и атомы) Без понимания работы CPU и памяти, сложно представить себе что такое атомарность операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 21:47 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
BlazkowiczPetro123no56892, Странно в этом тысячилетии...в ЯП..высокого уровня говорить про регистры и атомы) Без понимания работы CPU и памяти, сложно представить себе что такое атомарность операций. выше был хороший пример. - зачем в СУБД программисту знать подробности про кластерный индекс? СУБД обеспечивает атомарность перемещения индекса на новую позицию. Мы не на ассемблере пишем. Или так......кому нужны Неатомарная запись в Переменную? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 21:55 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
или так: - всё относительно и "в контексте" (cdtyjv ). Поэтому для программиста нет ячеек памяти. Есть - переменная! IMHO ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 21:57 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
LSD19912Нет в JAVA есть только одна атомарная операция, и это операция присваивания, более атомарных операций нет! Плохой совет, который может привести к трудноуловимым ошибкам. Не для всякого типа в Java операция присвоения атомарна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 00:19 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Petro123- зачем в СУБД программисту знать подробности про кластерный индекс? Зачем программисту на Java знать SQL, если есть Hibernate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 00:21 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Локшин МаркPetro123- зачем в СУБД программисту знать подробности про кластерный индекс? Зачем программисту на Java знать SQL, если есть Hibernate? Не путай sql и АтомныйНеделимый участок кода - переменную. ОРМ пока не покрывает потребностей (. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 07:56 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Локшин Марк, +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 08:00 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Для атомарного инкремента в Java есть классы AtomicInteger и AtomicLong. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 10:12 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
off dim-sДля атомарного инкремента в Java есть классы AtomicInteger и AtomicLong. а неатомарный вы писали и зачем? По аналогии - выключали ли вы сборщик мусора в проекте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 10:48 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Petro123Не путай sql и АтомныйНеделимый участок кода - переменную. ОРМ пока не покрывает потребностей (. А как связан этот "АтомныйНеделимый участок кода" и кластерный индекс, Вы кажется про него говорили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 11:55 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Локшин Марк, по логике и аналогии: - программисту СУБД не особо надо руками писать перемещение ячеек + крит.секция при создании Кластерного индекса. СУБД (компилятор) сам за этим следит. - программисту ЯП N-поколения не особо надо знать физический процесс записи в регистры памяти. Он оперирует выше уровнем - ПростойАтомарнойПеременной (простого типа). ... Сделали же Умные указатели памяти (с перемещением физ.адреса)? Программист не пишет мельче переменной, если это не ассемблер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 12:11 |
|
||
|
Атомарные операции
|
|||
|---|---|---|---|
|
#18+
Petro123- программисту СУБД не особо надо руками писать перемещение ячеек + крит.секция при создании Кластерного индекса. СУБД (компилятор) сам за этим следит. Руками писать не надо, а представлять к каким последствиям приведет создание кластерного индекса (т.е. что скрывается за create clustered index, к чему ведет insert в табличку с кластерным индексом, и т.д.) - весьма полезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 13:40 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127654]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 442ms |

| 0 / 0 |
