Objective-C에서 여러 스레드가 액세스 할 수있는 단일 클래스를 설계하고 있습니다. 내 수업에는 3-30 NSMutableArray
s가 있으며, 수업 외부에는 이라는 액세스 권한이 있습니다. 작업을 읽고 추가하고 제거하는 것은 당연히이 클래스에서 래핑됩니다.변경 가능한 배열 액세스에서 @synchronized 지시문을 널리 사용하는 것에 대한 대안
NSMutableArray
은 스레드로부터 안전하지 않으므로 @synchronized()
을 사용하여 작업을 안전하게 처리 할 수 있지만 @synchronized()
블록이 너무 많이 사용됩니다.
각 3 ~ 4 개의 배열에 대해 적어도 하나의 함수가 추가되었으므로 1 개의 함수가 제거되고 5 번은 값을 읽어야합니다. 그래서, 1 배열에 대해 적어도 7 @synchronized()
블록을 사용하고 있습니다. 4 배열의 경우 내 싱글 톤 클래스에 28 @synchronized
블록을 추가해야합니다.
내 문제에 접근하는 더 좋은 방법이 있습니까? 또는이 @synchronized
지시문을 모두 사용하면 문제가 발생합니까?
나는 내 객체를 스레드로부터 안전하게 만들고 싶다면 코드를 느리게 만들지 만 그 외에는 단점이 있다는 것을 알고있다.
1) 싱글 톤이 스레드로부터 안전하다면, 아마도 _NSMutableArray_의 데이터 멤버에 대해 걱정할 필요가 없을 것입니다. 2) 데이터 멤버의 _atomic/nonatomic_ 속성을 들어보고 사용 했어야합니다. 전자는 스레드를 안전하게합니다. 추가 보안을 위해 _NSMutableArrays_를 원자 적으로 선언 할 수 있습니다. – Adeel
또 다른 방법은 각 배열에 대해 직렬 디스패치 대기열을 만드는 것입니다. 그런 다음 배열 업데이트 방법의 관련 대기열에 동 기적으로 배열 업데이트를 전달할 수 있습니다. @Adeel, NSMutable 배열 속성을 원자 적으로 만들면 기본 배열 threadsafe가 아니라 속성 자체 만 만들 수 있습니다. – Paulw11
@Adeel : 변경할 수있는 객체 유형의 속성에 atomic 속성을 사용하면 돌연변이를 동기화하는 데 전혀 아무런 영향을 미치지 않습니다. 그것은 "스레드 안전"하지 않습니다. 한 가지만하고 한 가지만 수행합니다. getter와 setter가 중단되지 않도록합니다. 그 후에 제어되지 않는 개체는 어떻게됩니까? –