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

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



답변

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

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


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

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

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


답변

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

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

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


답변

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

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

통사론:

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

예:

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

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

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


답변

@synchronized 블록은 자동으로 잠금 및 잠금 해제를 처리합니다 . @synchronize 동기화에 사용중인 개체와 관련된 암시 적 잠금이 있습니다. 이 주제에 대한 매우 유익한 토론 은 Objective-C에서 @synchronized 잠금 / 잠금 해제 방법을 따르십시오 .


답변

여기에 훌륭한 대답 :

싱글 톤을 반환하는 클래스 메서드 이해에 도움

싱글 톤 생성 과정에 대한 자세한 설명과 함께.


답변

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

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

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


답변