很多人面试都会被问到线程和进程的区别,大家可以去看看知乎上的回答,我在这里就不再多做赘述。今天主要想聊一聊线程的缺点。
第一点线程增加了项目的复杂度,在编写多线程代码的过程中,时刻要关注死锁,多并发等问题。虽然进程的子线程通常具有独立的局部变量,但是他们却共享同一块全局内存,这个共享地址空间的竞争和临界区管理非常困难,很容易增加整体的系统复杂度,复杂度的增高也就意味着bug的增多,虽然底层已做了很多工作,但是还是不可避免的会出现死锁等问题。
第二点时序依赖,线程容易带来bug的一个重要原因是它们太容易知道彼此的内部状态,与有着独立地址空间,必须明确IPC通信的进程不同,线程没有自动封装,因此在编写多线程代码的时候,不仅要面对多并发的问题,还要面对“时序依赖”的问题。
第三点线程常常阻碍了抽象,为了防止死锁,在引入第三方库的时候要格外注意线程的用法是否规范,同样的如果编写的是底层工具库,还要注意应用层所带来的影响。
第四点可能带来性能问题,尽管线程没有快速转换进程上下文的开销,但是锁定共享数据结构以防止互相干涉的开销也很大,有的时候这些性能成本超过了进程分解为多线程所带来的优势。这一点在Android开发中应该深有体会,Android为何将UI的操作全部放到主线程中来执行,而在子线程中不允许操作UI,就是基于这个原因,如果要支持子线程操作UI,就要设计同步互斥机制,代价高昂且得不偿失。
网友评论