- 我们知道,当开启多条线程时,cpu调用时是在各个线程间切换执行
如:线程1,线程2,线程3.当线程创建时加载到内存,以及放到线程调用池中等待调用,cpu要调用哪条线程也是不确定的,当CPU在线程中切换调用时,它会把当前线程执行到的位置以及变量的值存储在内中,以便下次从该位置继续执行.从而引发一个问题当线程间访问一个全局变量时,如访问一个全局变量进行读写操作时a = a + 1.这时候就会造成读写错误.想要解决这样的问题,就要枷锁,保证哪个线程要执行这个操作,别的线程无法再进来,等待这个线程执行完,别的线程才可以进行.这样就保证了读写的同步进行.但同步枷锁(互斥锁)也会造成线程等待的现象,会造成执行效率变慢,所以同步枷锁应该尽量锁的代码越少越好. - 关于OC的原子属性(namotic)和非原子属性(nonamotic)
原子属性是线程安全的,它会内部自动枷锁(自旋锁),保证数据的读或写的安全.但要注意的是,它只能保证读的安全和写的安全,但不能保证同时进行读写的安全,如a=a+1,此时数据还是出现错误
几乎所有UIKit提供的类都是线程不安全的,所以更新UI的操作要放在主线程中进行.
以及所有包含Mutable的类.如MutableArray,Mutabledictionary...
网友评论