примитивные типы данных являются атомарными в Java [дубликаты]

1

Я читал, что примитивные типы данных, такие как boolean, byte, short, char, int и float, являются атомарными. 64-битные типы данных, такие как long и double, не являются.

Но что это значит? Когда у меня есть 2 потока, которые увеличивают и уменьшают значение переменной int, чем иногда, я все еще получаю условия гонки.

например, байт-код добавления суммы к переменной.

getfield #2 <Field int amount>
iload_1
iadd
putfield #2 <Field int amount>

Является ли атомарным в этом случае каждую операцию (getfield, iadd...), а не полное дополнение?

  • 0
    Дайте нам свой источник.
  • 0
    Атомарный означает, что операция, которая изменяет значение, происходит "сразу", как транзакция. Это не значит, что у вас не будет гоночных условий, это просто означает, что у вас не будет гоночных условий из-за атомистики.
Показать ещё 1 комментарий
Теги:
race-condition
atomic
atomicity

1 ответ

4
Лучший ответ

Когда у меня есть 2 потока, которые увеличивают и уменьшают значение переменной int, чем иногда, я все еще получаю условия гонки.

Да, вы будете - потому что хотя операции "get" и "set" для переменной int являются атомами, это не означает, что операция "increment" является атомарной.

Является ли атомарным в этом случае каждую операцию (getfield, iadd...), а не полное дополнение?

Да, точно. На самом деле примитивные типы не являются атомарными - это операции чтения и записи, которые являются атомарными. Это большая разница.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню