Я читал, что примитивные типы данных, такие как 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...), а не полное дополнение?
Когда у меня есть 2 потока, которые увеличивают и уменьшают значение переменной int, чем иногда, я все еще получаю условия гонки.
Да, вы будете - потому что хотя операции "get" и "set" для переменной int
являются атомами, это не означает, что операция "increment" является атомарной.
Является ли атомарным в этом случае каждую операцию (getfield, iadd...), а не полное дополнение?
Да, точно. На самом деле примитивные типы не являются атомарными - это операции чтения и записи, которые являются атомарными. Это большая разница.