Двойная проверка блокировки - цель c

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

Как насчет этого случая в объективе-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 ответа

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

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

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

- (void) startStreaming:(NSArray *)watchlistInstrumentData {
        @synchronized(self) {
            if (!self.isStreaming) {
...
Другие вопросы по тегам