Что означает свойство «Неатомный»?


144

Что означает "неатомный" в этом коде?

@property(nonatomic, retain) UITextField *theUsersName;

В чем разница между атомным и неатомным?

Спасибо


3
Извините, забыл указать это в Objective-c (какао)

Пожалуйста, также прочитайте эту ссылку - stackoverflow.com/questions/588866/…
Виджаяндра

Для всех, кто читает это, в 2014 году важно понимать, что большая часть этой информации сильно устарела. Одним словом, нет причин когда-либо использовать неатомные, и, по сути, неправильно использовать их по любой причине. это древняя история. Неатомарный означает «небезопасный режим нити» и (одним словом) теперь совершенно не имеет значения. Некоторые комментарии здесь stackoverflow.com/q/23977765/294884
Толстяк

Я бы не согласился с «несоответствующим» утверждением. Если значение меняется Редко и в качестве примера в Apple doc используется фамилия. Он меняется один раз, тогда использование атомарного подсказки является пустой тратой ресурсов, так как проверки не нужны.
Ник Тернер

Ответы:


268

Посмотрите на Apple Docs .

По сути, если вы говорите nonatomic, и вы генерируете методы доступа с использованием @synthesize, то, если несколько потоков пытаются изменить / прочитать свойство одновременно, может произойти сбой. Вы можете получить частично записанные значения или переизданные / сохраненные объекты, которые могут легко привести к сбоям. (Хотя это потенциально намного быстрее, чем атомарный метод доступа.)

Если вы используете значение по умолчанию (то есть atomic; раньше для этого не было ключевого слова, но теперь есть ), то @synthesizeметоды d используют блокировку на уровне объекта, чтобы обеспечить сериализацию нескольких операций чтения / записи в одно свойство. Как указывают документы Apple, это не означает, что весь объект является потокобезопасным , но отдельные свойства для чтения / записи являются.

Конечно, если вы реализуете свои собственные средства доступа, а не используете @synthesize, я думаю, что эти объявления ничего не делают, кроме того, что выражают ваше намерение относительно того, реализовано ли свойство безопасным способом.


7
Мне нравится этот ответ - менее запутанный, более простой и более полный, чем те, которые можно найти в другом месте!
PapillonUK

Действительно отличный и менее запутанный (+1), но не могли бы вы сказать, почему неатомарное потенциально намного быстрее, чем атомарный метод доступа?
Желание

2
@Wish Неатомарные средства доступа могут быть быстрее, потому что для предотвращения одновременного чтения / записи другими потоками, вам нужно удерживать мьютекс или делать некоторые другие низкоуровневые трюки, которые стоят процессорного времени. Если вы используете блокировку, вы также можете блокировать другие потоки, что тоже занимает много времени.
Джесси Русак

1
@Rob Вы можете задать новый вопрос об этом.
Джесси Русак

1
@Pratik Извините, это не правильно. Цитата, которую вы показываете, говорит о том же, что и я: создание свойства atomicпозволяет избежать сбоев при доступе к отдельным свойствам, но не гарантирует, что объект в целом (то есть доступ к отдельным свойствам, таким как имена и фамилии) будет выполнять правильная вещь.
Джесси Русак

46

После прочтения большого количества статей и статей StackOverflow и создания демонстрационных приложений для проверки атрибутов свойств переменных, я решил собрать всю информацию об атрибутах вместе

  1. atomic // default
  2. неатомической
  3. strong = сохранить // по умолчанию
  4. слабый = unsafe_unretained
  5. сохранить
  6. назначить // по умолчанию
  7. unsafe_unretained
  8. копия
  9. только для чтения
  10. readwrite // по умолчанию

поэтому ниже приведена подробная ссылка на статью, где вы можете найти все вышеупомянутые атрибуты, которые определенно вам помогут. Большое спасибо всем людям, которые дают лучшие ответы здесь!

Атрибуты свойства переменной или модификаторы в iOS

  1. атомное
    • Атомный означает, что только один поток обращается к переменной (статический тип).
    • Атомный потокобезопасный.
    • Но это медленно в производительности.
    • Атомное поведение по умолчанию.
    • Атомные методы доступа в среде без сбора мусора (т.е. при использовании retain / release / autorelease) будут использовать блокировку, чтобы гарантировать, что другой поток не будет мешать правильной установке / получению значения.
    • на самом деле это не ключевое слово.

Пример :

@property (retain) NSString *name;

@synthesize name;
  1. неатомической
    • Неатомарный означает, что многопоточный доступ к переменной (динамический тип).
    • Неатомный поток небезопасен.
    • Но это быстро в исполнении.
    • Nonatomic НЕ является поведением по умолчанию; нам нужно добавить неатомное ключевое слово в атрибуте свойства.
    • это может привести к неожиданному поведению, когда два разных процесса (потока) обращаются к одной и той же переменной одновременно.

Пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

В дополнение к тому, что уже было сказано о безопасности потоков, неатомарные свойства работают быстрее, чем атомарные методы доступа. Это не то, о чем вам обычно нужно беспокоиться, но имейте это в виду. По этой причине сгенерированные свойства Core Data частично неатомичны.


9

В многопоточной программе атомарная операция не может быть частично прервана, тогда как неатомарные операции могут.

Поэтому вы должны использовать мьютексы (или что-то в этом роде), если у вас есть критическая неатомическая операция, которую вы не хотите прерывать.


8

Если вы укажете «атомарный», сгенерированные функции доступа будут иметь дополнительный код для защиты от одновременных обновлений.



2

Вы можете получить представление об этом материале, прочитав статью ниже.

Объяснение потоков с целью неатома

неатомный - не безопасный поток

atomic - Thread Safe - это атрибут свойства по умолчанию.


1
Вы уверены, что это не наоборот? Атомные свойства являются безопасными , но неатомические свойства не безопасны. В прошлый раз, когда я проверял, это было так: P
David Rönnqvist

0

В «атомарных» означает , что доступ к свойству потокобезопасно. В то время как „неатомическое“ противоположен ему. Когда вы объявляете свойство в Objective-C свойство атомарное по умолчанию , так что синтезированные аксессоры обеспечивают надежный доступ к собственности в многопоточной среде, то есть значение, возвращаемое из метода получения или устанавливаемое через установщик, всегда полностью извлекается или устанавливается независимо от того, какие другие потоки выполняются одновременно, но если вы объявите свойство как неатомичное, как показано ниже

@property (nonatomic, retain)  NSString *myString;

тогда это означает, что синтезированный метод доступа к свойству объекта просто возвращает значение напрямую. Влияние неатомического атрибута зависит от среды. По умолчанию синтезированные средства доступа являются атомарными. Таким образом, неатомное значительно быстрее, чем атомное.


-2

Один для многопоточности. Один не


ИМХО: для того, чтобы получить какие-либо возражения, вам нужно быть более конкретным и потратить некоторое время на написание своего ответа.
Йохан Карлссон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.