Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Атомарные операции / 25 сообщений из 31, страница 1 из 2
12.08.2010, 14:31
    #36788435
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Добрый день!
Как вы думаете, операция инкремента примитивного типа int атомарна?

простой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
 class  Thing {
   public   int  t =  1 ;
   public   void  incT() {
      t ++;
  }
  ...
}

если на одном и том же экземпляре Thing несколько потоков будут выполнять несинхронизированный метод incT, будут-ли проблемы?
или в конечном счете все будет ок и t будет равна суммарному колличеству вызовов?

Всегда думал что простые операции над примитивными типами атомарны, но тут задумался и теперь кажется что нет.
Так как чтобы инкрементировать значение переменной, как минимум нужно (на разных устройствах конечно по-разному):
1 Из ячейки памяти загрузить ее сначало в регистр
2 Потом этот регистр инкрементировать (вот это точно атомарно!! :))
3 А потом сохранить обратно

Даже при таком раскладе другой поток может вмешаться уже между пунктами 1 и 2.
...
Рейтинг: 0 / 0
12.08.2010, 14:33
    #36788441
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
...
Рейтинг: 0 / 0
12.08.2010, 16:21
    #36788877
rabiter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Blazkowicz,

Ясненько, спасибо овтет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.03.2012, 21:22
    #37720828
LSD19912
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Нет в JAVA есть только одна атомарная операция, и это операция присваивания, более атомарных операций нет!
...
Рейтинг: 0 / 0
23.03.2012, 21:25
    #37720830
LSD19912
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Операция инкрементування не атомарная, потому что находится ячейка памяти, где есть значение, которое нужно увеличить, затем оно извлекается из данной ячейки памяти инкрементируется и записывается снова в ячейку памяти.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
10.02.2014, 23:08
    #38556393
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Прошу прощения пост старый, просто искал информацию и попал в этот пост. Вопрос вот в чем:

авторНет в JAVA есть только одна атомарная операция, и это операция присваивания, более атомарных операций нет!

А если:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class Thing {
  
  public void incT() {
      int t;
      t ++;
  }
  ...
}



Это разве не атомарно ? Ведь каждый Thread при входе в метод создает каждый свой фрейм?

И вопрос еще в догонку, можно ли считать инструкции JVM каждую в отдельности - атомарной?
...
Рейтинг: 0 / 0
10.02.2014, 23:47
    #38556438
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
no56892Это разве не атомарно ? Ведь каждый Thread при входе в метод создает каждый свой фрейм?

То что переменная объявлена локальной делает её не доступной для других потоков. Но это никак не влияет на атомарность отдельно взятых операций. Метод потокобезопасный, так как он не оперирует критическими ресурсами. Атомарность это свойство отдельных операций, а не методов.

no56892И вопрос еще в догонку, можно ли считать инструкции JVM каждую в отдельности - атомарной?
Нет. Имеются ввиду инструкции байт-кода?
...
Рейтинг: 0 / 0
11.02.2014, 13:09
    #38556974
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
BlazkowiczНо это никак не влияет на атомарность отдельно взятых операций. Метод потокобезопасный, так как он не оперирует критическими ресурсами
Т.е. атомарная операция(ии) всегда имеет(ют) отношение к shared ресурсам?

BlazkowiczНет. Имеются ввиду инструкции байт-кода?
Ну вот эти .
...
Рейтинг: 0 / 0
11.02.2014, 13:12
    #38556982
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
no56892Т.е. атомарная операция(ии) всегда имеет(ют) отношение к shared ресурсам?

Нет. Операция это операция. Ресурс это ресурс. Способ использования ресурса никак не валияет на атомарность отдельной взятой операции.

no56892Ну вот эти .
Таки инструкции байт-кода. Нет, не атомарны.
...
Рейтинг: 0 / 0
11.02.2014, 18:44
    #38557573
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Blazkowiczno56892Т.е. атомарная операция(ии) всегда имеет(ют) отношение к shared ресурсам?

Нет. Операция это операция. Ресурс это ресурс. Способ использования ресурса никак не валияет на атомарность отдельной взятой операции.

no56892Ну вот эти .
Таки инструкции байт-кода. Нет, не атомарны.

Все не атомарны или атомарны, но не все?

А где найти определение атомарной операции? Если, например, операция состоит из двух атомарных операций, то она может быть уже не атомарна?

Дак ведь недоступна для другого потока (это про инкремент локальной переменной метода), а если допустим, это была бы переменная объекта? и на ней сделать семафор, то во время использования один потоком так же не доступн для всех остальных? Почему она в данном случае не считается атомарной?
...
Рейтинг: 0 / 0
11.02.2014, 19:29
    #38557631
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
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.
public class MyObject {
    private int i;

    public void op1() {
        i++;
    }

    public void op2() {
        i--;
    }
}


Пример атомарных операций:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class MyObject {
    private int i;

    public synchronized void op1() {
        i++;
    }

    public synchronized void op2() {
        i--;
    }
}


Пример двух атомарных операций, которые перестают быть таковыми после того, как появляется op3():
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class MyObject {
    private int i;

    public synchronized void op1() {
        i++;
    }

    public synchronized void op2() {
        i--;
    }
 
    public void op3() {
        i = 0;
    }
}

...
Рейтинг: 0 / 0
11.02.2014, 19:50
    #38557656
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
cdtyjv Пусть на ресурсе R определен набор связанных операций {O1, O2 ... OX). Мы говорим, что операция On ресурса R является атомарной, если в процессе ее работы никакая другая операция из множества {O1; ON} не может изменить состояние этого объекта так, что это повлияет на результат операции On.
Дак инкремент локальной переменной это все-таки тогда атомарная операция или нет?

А почему инструкции JVM не атомарны каждая в отдельности?

Ведь инкремент (переменной объекта) это:
Вытащить значение из heap на стек раз
Инкрементировать верхний элемент стека два
Значение со стека поместить обратно в heap три
...
Рейтинг: 0 / 0
11.02.2014, 20:01
    #38557669
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
no56892 ,
Перечитайте, что я написал выше. Что бы сказать, является ли конкретная операция атомарной или нет, необходимо:
1) Определить ресурс
2) Определить набор операций на этом ресурсе относительно которых мы будем судить об атомарности рассматриваемой операции.

То есть атомарность это относительное понятие. А потому ваш вопрос "атомарен ли инкремент" некорректен в принципе вне контекста. Я вам привел три примера инкремента переменных. Сам инкремент везде одинаков, это просто i++. Но атомарен он только во втором примере.
...
Рейтинг: 0 / 0
11.02.2014, 20:18
    #38557689
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
cdtyjvПеречитайте, что я написал выше. Что бы сказать, является ли конкретная операция атомарной или нет, необходимо:
1) Определить ресурс
2) Определить набор операций на этом ресурсе относительно которых мы будем судить об атомарности рассматриваемой операции.
Допустим, есть ячейка памяти и есть регистр процессора. Процессор умеет выполнять арифметические операции только на своих внутренних регистрах, поэтому, чтобы инкрементировать число в данной ячейке ему надо сначало загрузить ее значение в регистр, инкрементировать регистр и положить обратно. Вот допустим ресурс - ячейка памяти и две(запись/чтение)+одна операции. Можно ли сделать вывод об их атомарности на основании этого? Мое предположение если процессор один, то инкремент - атомарная операция, если >=2, то нет, но каждая из этих операций по прежнему остается атомарной.

cdtyjvТо есть атомарность это относительное понятие. А потому ваш вопрос "атомарен ли инкремент" некорректен в принципе вне контекста. Я вам привел три примера инкремента переменных. Сам инкремент везде одинаков, это просто i++. Но атомарен он только во втором примере.

Но у меня вопрос по поводу инкремента локальной переменной метода?
...
Рейтинг: 0 / 0
11.02.2014, 20:27
    #38557706
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
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Но у меня вопрос по поводу инкремента локальной переменной метода?Это не так. В вашем первом сообщении вы привели код, где инкрементируемая переменная не является локальной.
Применительно к действительно локальным переменным, понятие атомарности смысла не имеет, так как их может видеть только один поток. Следовательно, все операции над локальными переменными являются атомарными по умолчанию.
...
Рейтинг: 0 / 0
11.02.2014, 20:41
    #38557736
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
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 extends Object{}

Object objA = new A();



В данном случае информация о типе A объекта, созданного new хранится вместе с объектом в heap?
...
Рейтинг: 0 / 0
11.02.2014, 20:51
    #38557742
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
no56892Ну дак все-таки,
А {T1...T8} каждая в отдельности атомарна?В принципе, можно так сказать. Другое дело, что толку от такой атомарности никакого нет.

no56892И можно ли сделать вывод, что инструкции JVM каждая в отдельности атомарна?Что такое инструкция JVM? Каждая строчка Java кода статически преобразовывается в какое-то количество инструкций байт-кода, когда вы компилирует есвой код. Каждай инструкция байт-кода, в свою очередь компилируется уже в какое-то количество машинных инструкций. Причем, это происходит динамически, и одна и та же байт-код инструкция может компилироваться в разные машинные команды в зависимости от платформы, JVMки, срабаыватния различных оптимизаций, и т.д..
Поэтому ваш вопрос по сути лишен смысла.
...
Рейтинг: 0 / 0
11.02.2014, 21:04
    #38557759
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
cdtyjv Что такое инструкция JVM?
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5

Вот например есть два потока, каждый из которых в любой момент может выполнить любую из них. Возможно ли, что в каком-то случае "другая операция из множества ... может изменить состояние ..., что это повлияет на результат операции"
...
Рейтинг: 0 / 0
11.02.2014, 21:36
    #38557790
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
no56892,
Странно в этом тысячилетии...в ЯП..высокого уровня говорить про регистры и атомы)
...
Рейтинг: 0 / 0
11.02.2014, 21:47
    #38557805
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Petro123no56892,
Странно в этом тысячилетии...в ЯП..высокого уровня говорить про регистры и атомы)
Без понимания работы CPU и памяти, сложно представить себе что такое атомарность операций.
...
Рейтинг: 0 / 0
11.02.2014, 21:55
    #38557814
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
BlazkowiczPetro123no56892,
Странно в этом тысячилетии...в ЯП..высокого уровня говорить про регистры и атомы)
Без понимания работы CPU и памяти, сложно представить себе что такое атомарность операций.
выше был хороший пример.
- зачем в СУБД программисту знать подробности про кластерный индекс?
СУБД обеспечивает атомарность перемещения индекса на новую позицию.
Мы не на ассемблере пишем.
Или так......кому нужны Неатомарная запись в Переменную?
...
Рейтинг: 0 / 0
11.02.2014, 21:57
    #38557816
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
или так:
- всё относительно и "в контексте" (cdtyjv ). Поэтому для программиста нет ячеек памяти. Есть - переменная!
IMHO )))
...
Рейтинг: 0 / 0
12.02.2014, 00:19
    #38557904
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
LSD19912Нет в JAVA есть только одна атомарная операция, и это операция присваивания, более атомарных операций нет!
Плохой совет, который может привести к трудноуловимым ошибкам. Не для всякого типа в Java операция присвоения атомарна.
...
Рейтинг: 0 / 0
12.02.2014, 00:21
    #38557906
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Petro123- зачем в СУБД программисту знать подробности про кластерный индекс?

Зачем программисту на Java знать SQL, если есть Hibernate?
...
Рейтинг: 0 / 0
12.02.2014, 07:56
    #38557996
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Атомарные операции
Локшин МаркPetro123- зачем в СУБД программисту знать подробности про кластерный индекс?

Зачем программисту на Java знать SQL, если есть Hibernate?
Не путай sql и АтомныйНеделимый участок кода - переменную. ОРМ пока не покрывает потребностей (.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Атомарные операции / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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