问题现象
我们知道iOS有串行和并行两种分发队列(DispatchQueue), 其中串行队列每次只能执行一个任务,通常被当做一种很好的同步器来使用。
但是,下面使用串行队列却也无法达到同步读写count属性的目的,这是怎么回事呢?
如上,我们试图使用串行队列queue来同步count属性的读写操作,但实际执行发现count属性100次加+1操作结果却远远小于100。
这是神马情况?让我们一起来探究一下吧?😉
问题分析
1. 罪不在此?
看到上面的测试结果,很多小伙伴们可能会动摇串行队列可做同步器的信心。
上面代码中用串行队列保护Task.count属性读写操作的同步,到底有错吗?
答案是:并没有!!!
之前之所以100次+1不等于100的根本原因在于: tasks.count += 1 这行代码没有被同步保护,换句话说它本身不是一个原子