@synchronized 锁的坑点

for (int i=0; i<100000; i++) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            @synchronized (self.dataArray) {
                self.dataArray = [NSMutableArray array];
            }
        });
    };

按道理来说,给dataArray加上锁是线程安全的,但是运行这行代码会报错。出现野指针

*** -[__NSArrayM release]: message sent to deallocated instance 0x600000ce11d0

这是为什么呢,首先先说一下 @synchronized,当@synchronized(nil)加锁对象是nil的时候,加锁会失效,就会走它里面的流程。不停的对dataArray进行创建新对象的时候,会执行新对象的创建,和旧对象的释放,会有那么一瞬间,存在哈希表中的dataArray会为nil,然后@synchronized就不加锁,导致self.dataArray连续执行release,从而出现野指针。

如有错误,请留言指正,谢谢!!!

你可能感兴趣的:(@synchronized 锁的坑点)