获取一个可变数组的内容时,要上锁吗?

看苹果的文档,看到以下的示例

NSLock* arrayLock = GetArrayLock();
NSMutableArray* myArray = GetSharedArray();
id anObject;
 
[arrayLock lock];
anObject = [myArray objectAtIndex:0];
[anObject retain];
[arrayLock unlock];
 
[anObject doSomething];
[anObject release];

说是为了保证线程安全。
想问问各位,平时写代码的时候会这么做吗?

阅读 5.1k
3 个回答

你的代码中提到的是对一个数组取值的时候进行加锁,主要是为了线程安全,原因在于:
如果不加锁的话,如果下面的情况同时发生,这时候:

  1. 线程A在读

  2. 线程B、线程C在写不同的值

那么,线程A可能会读到三种值,即原始值、线程B修改之后的值、线程C修改之后的值(极端情况下可能取到的值都已经被破坏了,比如,一个稍微大点的文件),最终的值可能是B修改之后的,也可能是C修改之后的。

所以针对这种情况,在并发编程的情况下(要是单线程的话,没事加啥锁),我们一般会加锁,那么这有很多种方式:

  1. atmoic,我一般不太用,因为它的锁会限制单线程读写,虽然我要单线程写,但是我不要单线程读。而且,并不一定可以线程安全。

  2. dispatch_barrier

  3. 类似于你上面的其他锁等。

不管什么方式,都是为了数据一致性和线程安全,可能我们平时写法上会比较少这么写(因为你可能写并发不多)。

所以,在你确认你是之用主线程(单线程),或者你能确保不会出现多线程读写的情况的话,你可以不加任何东西。

当然,即使你可能会有多线程读写的情况,也不一定会发生数据不一致,这其中有很大的偶然性。

还有“release”,很老的文档了吧。
iOS里从来没用过,也没见过。

要不要上锁取决于你会不会在多个线程里操作这个可变数组,上锁有些太重了,大部分时候都应该避开。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题