Блок в @synchronized - PullRequest
       15

Блок в @synchronized

1 голос
/ 14 сентября 2011

Выполнение блока внутри @synchronized, кажется, сводит на нет блокировку.

- (void)method {
    @synchronized(self) {
        if(ivar == nil) {
            ivar = [myBlock() retain];
        }
    }
}

Переменная экземпляра ivar не записана ни в каком другом месте.

Я заметил, чтоблок myBlock иногда выполняется в моем приложении дважды.

Как это может произойти?Как избежать этого и сделать реально работающую блокировку?

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Блокировка работала нормально, поскольку synchronized блокирует только потоки, и один и тот же поток дважды обращался к региону. Проблема заключалась в том, что при некоторых обстоятельствах myBlock казнился внутри.

0 голосов
/ 14 сентября 2011

Может быть, вы могли бы переместить блокировку внутри блока.

...