백그라운드 대기열에서이 myID
개체와의 상호 작용을 동기화하려는 경우, 다른 방법으로는 전달 된 블록 내부의 잠금을 원할 것입니다. 지금 당신은 : 당신의 큐에 파견 블록을 추가하는 과정을 동기화하지만,하지있어
@synchronized(myID) {
dispatch_async(queue, ^{
// do stuff with myID
});
}
이 하지 당신이 백그라운드에서 무슨 일을하는지 동기화 할 수 있습니다. 나는 그것이 당신이 의미하는 바가 아닌 것으로 의심합니다.
는 당신은 아마 구성 : 그것은 완전히 다른 동작이 매우 비슷하지만, 결과
dispatch_async(queue, ^{
@synchronized(myID) {
// do stuff with myID
}
});
. 이제 배경 대기열로 발송 된 작업이 동기화되고 있습니다. 추가 정제로
이 (그리고 내가있을 수 있습니다 가정), 그때는 아마 최대한
@synchronized
블록 제한 싶어 블록이 가능 느린 파견 경우 :
dispatch_async(queue, ^{
// do slow stuff in preparation for interacting with `myID`
@synchronized(myID) {
// quickly do stuff with myID
}
// do anything else here
});
당신이 만약을 @synchronized
블록 내의 모든 배경 블록을 수행하면 백그라운드로, 즉 주 큐에 미치는 영향을 최소화하기 위해 전체 목적을 무시할 수 있습니다. 이 마지막 변환은 그 문제를 완화합니다.
마지막 관찰 결과, 직렬 대기열 (또는 장벽으로 업데이트하는 비전 역동적 대기열)이있는 경우에는 잠금을 사용할 필요가없는 한 기술로 자주 사용됩니다 myID
에 대한 모든 업데이트 및 질의가 해당 큐에 전달됩니다. 동시성 프로 그래 V 안내서에서 Eliminating Lock-Based Code을 참조하십시오.
출처
2013-09-05 01:37:36
Rob
달성하려는 목표는 무엇입니까? – Wain
BTW, 나는 당신이 _mot_ 어떤 시점에서 'myID'를 reinstantiating 있다고 가정하여 맞습니까? '@ synchronized' 블록은 일반적으로 변수가 아니라 myID가 가리키는 객체의 특정 인스턴스에 고유합니다. – Rob