看苹果的文档,看到以下的示例
NSLock* arrayLock = GetArrayLock();
NSMutableArray* myArray = GetSharedArray();
id anObject;
[arrayLock lock];
anObject = [myArray objectAtIndex:0];
[anObject retain];
[arrayLock unlock];
[anObject doSomething];
[anObject release];
说是为了保证线程安全。
想问问各位,平时写代码的时候会这么做吗?
你的代码中提到的是对一个数组取值的时候进行加锁,主要是为了线程安全,原因在于:
如果不加锁的话,如果下面的情况同时发生,这时候:
线程A在读
线程B、线程C在写不同的值
那么,线程A可能会读到三种值,即原始值、线程B修改之后的值、线程C修改之后的值(极端情况下可能取到的值都已经被破坏了,比如,一个稍微大点的文件),最终的值可能是B修改之后的,也可能是C修改之后的。
所以针对这种情况,在并发编程的情况下(要是单线程的话,没事加啥锁),我们一般会加锁,那么这有很多种方式:
atmoic
,我一般不太用,因为它的锁会限制单线程读写,虽然我要单线程写,但是我不要单线程读。而且,并不一定可以线程安全。dispatch_barrier
。类似于你上面的其他锁等。
不管什么方式,都是为了数据一致性和线程安全,可能我们平时写法上会比较少这么写(因为你可能写并发不多)。
所以,在你确认你是之用主线程(单线程),或者你能确保不会出现多线程读写的情况的话,你可以不加任何东西。
当然,即使你可能会有多线程读写的情况,也不一定会发生数据不一致,这其中有很大的偶然性。