В чем разница между атомарными и неатомарными атрибутами? - PullRequest
1796 голосов
/ 26 февраля 2009

Что означают atomic и nonatomic в объявлениях свойств?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Какая оперативная разница между этими тремя?

Ответы [ 27 ]

3 голосов
/ 01 февраля 2016

Атомный означает, что только один поток может получить доступ к переменной одновременно (статический тип). Атомный потокобезопасный, но он медленный.

Неатомный означает, что несколько потоков могут обращаться к переменной одновременно (динамический тип). Неатомный потокобезопасен, но он быстр.

2 голосов
/ 29 января 2019

Атомарность атомный (по умолчанию)

По умолчанию используется атомарное: если вы ничего не печатаете, ваше свойство атомарное. Атомарное свойство гарантировано, что если вы попытаетесь прочитать из него, вы получите верное значение. Это не дает никаких гарантий относительно того, каким может быть это значение, но вы получите хорошие данные, а не только ненужную память. Это позволяет вам делать, если у вас есть несколько потоков или несколько процессов, указывающих на одну переменную, один поток может читать, а другой поток может писать. Если они попадают в одно и то же время, поток чтения гарантированно получит одно из двух значений: либо до изменения, либо после изменения. То, что не дает вам атомарность, это какая-то гарантия того, какие из этих ценностей вы можете получить. Atomic обычно путают с поточностью потоков, и это не правильно. Вы должны гарантировать безопасность вашей нити другими способами. Однако atomic гарантирует, что если вы попытаетесь читать, вы получите какое-то значение.

неатомической

С другой стороны, неатомарное, как вы, вероятно, можете догадаться, просто означает «не делайте этого атомарного материала». То, что вы теряете, это гарантия того, что вы всегда что-то получите. Если вы попытаетесь прочитать во время записи, вы можете получить данные с мусором. Но, с другой стороны, вы идете немного быстрее. Поскольку атомарные свойства должны творить чудеса, чтобы гарантировать возвращение значения, они немного медленнее. Если это свойство, к которому вы часто обращаетесь, вы можете перейти к неатомному, чтобы убедиться, что вы не понесете этот штраф за скорость. Доступ

вежливость https://academy.realm.io/posts/tmi-objective-c-property-attributes/

Атрибуты свойства атомарности (атомарные и неатомарные) не отражены в соответствующем объявлении свойства Swift, но гарантии атомарности реализации Objective-C все еще сохраняются, когда к импортированному свойству обращаются из Swift.

Итак - если вы определите атомарное свойство в Objective-C, оно останется атомарным при использовании Swift.

любезность https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

2 голосов
/ 13 февраля 2016

Если вы используете атомарный, это означает, что поток будет безопасным и доступным только для чтения. Если вы используете nonatomic, это означает, что несколько потоков обращаются к переменной и являются потокобезопасными, но они выполняются быстро, выполняют операции чтения и записи; это динамический тип.

0 голосов
/ 04 августа 2018

Атомные свойства : - Когда переменная, назначенная с атомарным свойством, которое означает, что она имеет доступ только к одному потоку, будет поточно-ориентированной и будет хорошей с точки зрения производительности, будет иметь поведение по умолчанию.

Неатомарные свойства : - Когда переменная назначена с атомарным свойством, что означает, что она имеет многопоточный доступ и не будет поточно-ориентированной, а с точки зрения производительности будет медленной, будет иметь поведение по умолчанию и когда два разные потоки хотят получить доступ к переменной одновременно, что даст неожиданные результаты.

0 голосов
/ 09 декабря 2016

Правда в том, что они используют спин-блокировку для реализации атомарного свойства. Код как ниже:

 static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
      ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) 
    {
        id oldValue;
        id *slot = (id*) ((char*)self + offset);

        if (copy) {
            newValue = [newValue copyWithZone:NULL];
        } else if (mutableCopy) {
            newValue = [newValue mutableCopyWithZone:NULL];
        } else {
            if (*slot == newValue) return;
            newValue = objc_retain(newValue);
        }

        if (!atomic) {
            oldValue = *slot;
            *slot = newValue;
        } else {
            spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
            _spin_lock(slotlock);
            oldValue = *slot;
            *slot = newValue;        
            _spin_unlock(slotlock);
        }

        objc_release(oldValue);
    }
0 голосов
/ 23 сентября 2016

Чтобы упростить всю путаницу, давайте разберемся с блокировкой мьютекса.

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

В iOS @sychronise также обеспечивает блокировку мьютекса. Теперь он работает в режиме FIFO и гарантирует, что на поток не влияют два класса, совместно использующие один и тот же экземпляр. Однако, если задача находится в главном потоке, избегайте доступа к объекту с использованием атомарных свойств, поскольку он может содержать ваш пользовательский интерфейс и ухудшать производительность.

0 голосов
/ 29 июня 2016

Atomic: обеспечить безопасность потока, заблокировав поток с помощью NSLOCK.

Не атомарный: не обеспечивает безопасность потока, поскольку нет механизма блокировки потока.

...