nonatomic vs atomic 알아보기
Objective C 언어부터 사용했던 개발자라면 한번쯤 Property(@property) 선언할 때 속성을 지정하는데, 그 중 대부분을 "nonatomic" 으로 사용하고 있을 것 이다.
Swift 언어가 많은 안정화 진행하면서 많은 개발자들이 Objective C 언어에서 Swift 언어로 넘어가면서 속성들을 신경쓰지 않게 되었다.
필자는 해당 부분을 찾아보려고 했던 이유는 iOS 개발 경력이 Objective C 언어에서 부터 시작한 개발자라면 면접의 단골질문 중 하나이기 때문이다.
(면접당시에는 공부했는데, 나중에 되면 아무생각 없이 nonatomic을 사용하고 있는 나를 볼 수 있다....)
"atomic" 이라는 말은 "중단되지 않는" 이라는 뜻이다. 즉, atomic으로 선언된 함수의 경우 다른 프로세스나 쓰레드에 의해 interrupt 되지 않고 수행이 완료될 때까지 무결성을 유지한다.
CPU는 한 번에 단 한 가지의 일만을 수행하는데, 멀티쓰레딩을 지원하기 위해 아주 짧은 시간동안 생성된 각각의 쓰레드에게 CPU의 사용권한을 쪼개어 쓸 수 있도록 한다. 여기서 "atomic" Property가 필요하게 된다.
예를 들어 두개의 쓰레드가 하나의 변수를 참조 할 때,
쓰레드A에서 x라는 값을 1로 변경했는데,
쓰레드B에서 새로변경된 값 1이라는 값이 아닌
기존의 값 0을 읽어가는 문제가 발생할 수 있게된다.
이러한 경우를 방지하기 위해 atomic Property를 설정해 주게 된다.
(예제 그림 참조)
"nonatomic"은 이러한 데이터의 무결성을 보장 받지 않아도 되는 속성을 의미한다. 그러다면, 데이터의 무결성이 보장되는 atomic을 쓰지 않고 대부분의 객체가 nonatomic Property를 사용하는 이유는 뭘까?
정답은 간단하다 속도 문제이다.
atomic으로 설정된 Property의 getter/setter 메소드는 lock을 사용하여 멀티쓰레드를 안전하게 처리하는데, 이과정은 다른 쓰레드가 접근 할 수 없어서 불필요한 성능저하가 발생하기 때문이다.
쉽게 표현하자면,
atomic
멀티쓰레드 환경에서 데이터의 무결성이 보장되어야할 때 사용한다.(안전성 up, 처리속도 down)
nonatomic
멀티쓰레드 환경에서 데이터의 무결성이 보장되지 않아도 될 때 사용한다.(안전성 down, 처리속도 up)
언어기초에 대해 정리하시는걸 보니 이직 준비중이신가요?
답글삭제껄껄껄