двойная проверка блокировки - цель c - PullRequest
5 голосов
/ 07 июня 2010

Я понял, что двойная проверка блокировки имеет недостатки в Java из-за модели памяти, но обычно это связано с одноэлементным шаблоном и оптимизацией его создания.

Как насчет этого случая в target-c:

У меня есть логический флаг, чтобы определить, потоковое ли мое приложение или нет. У меня есть 3 метода, startStreaming, stopStreaming, streamingDataReceived, и я защищаю их от нескольких потоков, используя:

- (void) streamingDataReceived:(StreamingData *)streamingData {
    if (self.isStreaming) {
        @synchronized(self) {
            if (self.isStreaming) {

- (void) stopStreaming {
    if (self.isStreaming) {
        @synchronized(self) {
            if (self.isStreaming) {

- (void) startStreaming:(NSArray *)watchlistInstrumentData {
    if (!self.isStreaming) {
        @synchronized(self) {
            if (!self.isStreaming) {

Эта двойная проверка не нужна? У двойной проверки есть подобные проблемы в target-c как в java? Каковы альтернативы этому шаблону (анти-шаблон).

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Это в равной степени ущербно - у вас есть состояние гонки

Вы должны войти в синхронизированный раздел и затем установить флажок

0 голосов
/ 07 июня 2010

Для меня это выглядит преждевременной оптимизацией. Что не так с (например)

- (void) startStreaming:(NSArray *)watchlistInstrumentData {
        @synchronized(self) {
            if (!self.isStreaming) {
...
...