标签:
1,数据库I/O操作(异步)
数据库本身是存储在磁盘上。访问和修改数据库,即对磁盘进行读写,即I/O操作。
磁盘属于计算机硬件,具有DMA能力,不需要CPU干预,可以实现异步操作。
I/O操作一般是消耗时间,sqlite使用异步处理I/O操作。
当有多个事务对数据库进行操作,对应,也会有多个I/O操作。
操作系统将I/O操作,合理放入一个I/O队列。一次性将队列内的I/O操作提交给磁盘系统,并行处理多个I/O,提高效率。详细请看链接,本人也没有特别深入研究。
2,异步和多线程
异步和多线程,都有能力实现,不阻塞当前线程,使应用更“流畅”。 IOS最常见的, 不阻塞主线程,使UI表现更流畅。
两者有区别。 具体请看链接。
总之,异步的实现,是基于计算机硬件的支持,而多线程,是操作系统中,一段逻辑代码控制的。
3,线程安全以及处理
当一段代码或者某个变量,被多个线程同时访问和使用。 这些代码或者变量,可能会出现非预期的效果,比如数据紊乱和数据安全的问题,这是“非安全的”。
为了线程安全, 需要在同一时刻,只能有一个线程访问这些代码或者变量,IOS中使用“互斥锁”,来避免这个情况。
(互斥,mutex,从本身词语意思:不相容,互相排斥的。数学上,A和B互斥, 指A和B没有任何交集。 A和B不能同时发生。)
“互斥锁”即@synchronized(对象A) {} ,对象A,只能被一个线程访问。
因此,如果使用“互斥锁”,一定是在, 多个线程,同时访问一份资源的情况。
互斥锁,增加了CPU的开销。IOS中,atomic,就是为 setter 方法增加“互斥锁”。比不要的情况下,一定要使用“nonatomic”。
4,sqlite3以及sqlite3的多线程
sqlite3是轻量级的数据库。sqlite3同样使用异步I/O操作,来读取数据。关于sqlite3异步I/O操作,具体请看链接。
IOS中的sqlite3是线程安全的。IOS中UI在主线程,不阻塞UI线程,保证流畅,所以把sqlite的操作,需要迁移到子线程。这是sqlite3使用多线程的主要驱动力。
有一篇很好的文章,具体点击链接。
IOS中的sqlite,默认使用(2)的配置。不方便的是,如果要被另外的线程访问sqlite,其他的就必须关闭数据库连接。 代码中就有很多不方便的地方。
配置(1)不考虑,为单线程。
配置(3),将多线程变串行方式执行,
(暂停。。)
标签:
原文地址:http://www.cnblogs.com/pennbj/p/4792477.html