美文网首页iOS面试题
多线程安全问题

多线程安全问题

作者: conowen | 来源:发表于2018-05-23 17:39 被阅读78次

经典问题

@interface ViewController ()
@property (strong,nonatomic) NSString *str;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue_t_concurrent = dispatch_queue_create("com.test.concurrent", DISPATCH_QUEUE_CONCURRENT);
    for (int i= 0; i < 1000000; i++) {
        dispatch_async(queue_t_concurrent, ^{
            self.str = [NSString stringWithFormat:@"str =%d",i];
            }        
        });
    }
}

因为是异步并行队列,而且str属性是非原子性的,系统会开启多条线程来执行Block代码,运行的时候,几率出现crash现象。

原因:因为对self.str进行重新赋值的时候,会调用内部的setter方法的release方法,如果线程A调用release方法的时候,对象已经释放了,如果线程B在这个时刻调用了release方法,就出现crash现象。(访问一个已经释放的对象,会出现野指针问题EXC_BAD_ACCESS)

MRC的Setter与getter方法

//非原子性
- (void)setStr:(NSString *)str {
    [str retain];
    [_str release];
    _str = str;
}

- (NSString *)str {
    return _str;
}
//原子性
- (NSString *) str {
    NSString *str = nil;
    @synchronized(self) {
        str = [[_str retain] autorelease];
    }
    return str;
}

- (void) setStr:(UITextField *)str {
    @synchronized(self) {
      [str retain];
      [_str release];
      _str = str;
    }
}

就算上述的代码运行在ARC环境下,一样会导致crash现象,因为ARC的retain和release是由编辑器在编译的时候自动加上去的,最后一样会有retain和release方法。

解决方法

把self.str属性改成原子性的,或者给Block加锁,或者self.str属性改成weak属性。

相关文章

  • iOS 多线程技术有些啥,如何解决多线程带来的隐患

    有多线程就有因为多线程造成的数据安全问题(如何确保同一块共享内存在多线程下不发生数据错乱和数据安全问题) 线程同步...

  • ThreadLocal解析

    原理 产生线程安全问题的根源在于多线程之间的数据共享。如果没有数据共享,就没有多线程并发安全问题。ThreadLo...

  • ThreadLocal解析

    原理 产生线程安全问题的根源在于多线程之间的数据共享。如果没有数据共享,就没有多线程并发安全问题。ThreadLo...

  • 7.2 Handler消息传递机制

    简介:handler消息处理者,用来发生和处理消息,用于解决线程安全问题; 线程安全问题:多线程导致线程安全问题,...

  • Java学习笔记 23 - 线程之多线程安全、死锁、同步机制

    本文主要内容1、多线程安全问题2、等待唤醒机制 01线程安全 A:线程安全问题引发多线程并发访问同一个数据资源时,...

  • 多线程(四) @synchronized

    多线程出现最多的就是安全问题,解决多线程安全问题就是加锁。锁的种类有很多,每种锁使用场景、性能上都有所不同,我们写...

  • 18_线程安全_同步机制_锁

    多线程访问共享数据 造成安全问题 造成安全问题的原因 ==================锁 解决线程安全的方式 ...

  • 五 异常与多线程——第三节 线程同步机制

    1、线程安全问题的概述 多线程访问了共享的数据,就会产生线程安全问题 2、线程安全问题的代码实现 输出:会出现重复...

  • Java 面试系列:线程安全之 synchronized 和 R

    前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题。线程安全问题指的...

  • volatile关键字

    线程安全问题 Java多线程带来的一个问题是数据安全问题,判断一段Java代码是否有线程安全问题可从以下几点入手:...

网友评论

    本文标题:多线程安全问题

    本文链接:https://www.haomeiwen.com/subject/lotdjftx.html