@synchronized ()는 목적 C에서 싱글 톤 메소드로 무엇을합니까?


87

방금 싱글 톤 메서드를 만들었는데, @synchronized()자주 사용하지만 의미 를 모르기 때문에 함수 가 무엇을하는지 알고 싶습니다 .

답변:


119

코드 블록 주위에 중요한 섹션을 선언합니다 . 다중 스레드 코드 @synchronized에서 주어진 시간에 블록에서 해당 코드를 하나의 스레드 만 실행할 수 있도록 보장합니다.

그것이 무엇을하는지 알지 못한다면, 당신의 애플리케이션은 아마도 멀티 스레드가 아닐 것이고 아마도 그것을 사용할 필요가 없을 것입니다 (특히 싱글 톤 자체가 스레드로부터 안전하지 않은 경우).


편집 : 2011의 원래 답변에 없었던 정보를 더 추가합니다.

@synchronized지시자는 a로 보호 된 코드의 영역에 들어가는 다수의 스레드를 방지 @synchronized지시자 같은 객체를 참조 . @synchronized지시문에 전달 된 개체 는 "잠금"으로 사용되는 개체입니다. 다른 개체가 잠금으로 사용되는 경우 두 개의 스레드가 동일한 보호 코드 영역에있을 수 있으며 잠금과 동일한 개체를 사용하여 완전히 다른 두 코드 영역을 보호 할 수도 있습니다.

또한 nil잠금 개체 로 전달 하면 잠금이 전혀 적용되지 않습니다.


14
몇 가지 중요한 점 : 1) nil 포인터를 사용하면 @synchronized아무 일도하지 않습니다. 보호되지 않은 상태입니다. 2) @synchronized입니다 느린 .
Hot Licks

이 답변은 오해의 소지가 있으며 허용되는 답변이되어서는 안됩니다. 비록 그것이 말하는 것이 때때로 정확할지라도 ( 동기화에 전달 된 토큰 이 모든 스레드에서 동일한 객체 인 한) 오해의 소지가있는 불완전합니다. 동기화 는 "블록의 해당 코드"뿐만 아니라 연관된 코드 섹션의 수에 관계없이 동시에 실행되는 것을 방지합니다. 동기화 할 매개 변수 는 동시 액세스로부터 보호되는 코드 섹션 (또는 응답이 호출하는 "블록")을 효과적으로 결정합니다.
Arda 2017 년

@Arda 당신이 완전히 옳습니다. 에 대한 Apple 문서에 대한 약간의 정보와 링크를 추가했습니다 @synchronized.
John Calsbeek

@ JohnCalsbeek, 대답은 이제 훨씬 좋아 보입니다. 나로부터 엄지 손가락.
아르

@HotLicks는 이것을 지적하는 것이 흥미 롭습니다. 그러나 대안 (링크?)이 ​​무엇 일 수 있는지 간단히 말하면 더 좋았을 것입니다
itMaxence

43

여기여기에 있는 Apple 문서 에서 :

@synchronized 지시문은 Objective-C 코드에서 즉시 뮤텍스 잠금을 생성하는 편리한 방법입니다. @synchronized 지시문은 다른 뮤텍스 잠금이 수행하는 작업을 수행합니다. 즉, 다른 스레드가 동시에 동일한 잠금을 획득하는 것을 방지합니다.

문서는이 주제에 대한 풍부한 정보를 제공합니다. 시간을 들여 읽어 보는 것은 가치가 있습니다. 특히 그것이 무엇을하는지 알지 못한 채 사용하고 있다는 점을 감안하면 더욱 그렇습니다.


26

@synchronized지시문은 Objective-C 코드 에서 즉석에서 뮤텍스 잠금을 생성하는 편리한 방법 입니다.

@synchronized지시어는 할 일이 다른 뮤텍스 잠금이 될지 않습니다 같은 시간에 같은 잠금을 획득에서 다른 스레드를 방지 할 수 있습니다.

통사론:

 @synchronized(key) 
 { 
  // thread-safe code 
 }

예:

 -(void)AppendExisting:(NSString*)val
{
  @synchronized (oldValue) {
      [oldValue stringByAppendingFormat:@"-%@",val];
  }
}

이제 위의 코드는 완벽하게 스레드로부터 안전합니다. 이제 여러 스레드가 값을 변경할 수 있습니다.

위는 모호한 예일뿐입니다 ...


3
@synchronized (oldValue)이어야하지 않습니까?
Joel

아니면 @synchronized(val, oldValue) { ... }?
Valentin Shergin 2014 년

"완벽하게 스레드로부터 안전한"방식을 본 적이 있는지 잘 모르겠습니다. 최소한 어딘가에서 맹목적으로 코드를 복사하는 것이 아니라 무엇을하는지 알아야합니다.
Hot Licks 2015 년

하지만 위의 코드는 아무 일도하지 않기 때문에 결국 "완벽한 스레드 안전"이라고 생각합니다.
Hot Licks 2015 년



-2

@synchronized이다 thread safe메커니즘. 이 함수 내부에 작성된 코드 조각은 critical section한 번에 하나의 스레드 만 실행할 수있는 의 일부가 됩니다.

@synchronize잠금을 암시 적으로 NSLock적용하는 반면 명시 적으로 적용합니다.

스레드 안전성 만 보장 할뿐 보장하지는 않습니다. 내가 의미하는 것은 당신이 당신의 차를 위해 전문 운전사를 고용한다는 것입니다. 그래도 차가 사고를 만나지 않을 것이라는 보장은 없습니다. 그러나 확률은 미미합니다.


2
이것은 절대적으로 잘못되었습니다. dispatch_once는 @syncrhonized와 동일하지 않으며 싱글 톤 할당에서만 대체 될 수 있습니다.
jugutier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.