线程是操作系统最小的调度单元,多个线程同时运行,就是多线程。
为什么有多线程
- 多核CPU
多核CPU才是真正意义上的并行,现在最多的物理服务器好像有一千多核,多线程能充分发挥多核服务器的性能。
- IO操作不消耗CPU时间片
单核CPU也可以执行多线程程序,操作系统可以给每个线程分配时间片,在多个线程之间进行切换。因为IO操作(包括磁盘IO和网络IO)不消耗CPU时间片,所以单核CPU在某些情况执行多线程程序也会提升效率。
多线程真的快吗
- 上下文切换
操作系统切换线程的时候,会将线程的状态,加载到上次挂起的状态,这个过程会消耗一定的时间,如果频繁切换上下文,会影响线程的执行效率。
减少上下文切换的措施:1.无锁并发编程 2.使用CAS 3.使用最少的线程
有一次面试,面试官问我你看到mysql所在服务器CPU飙升,是什么问题:可能是有很多慢查询,cpu在这些慢查询之间一直调度导致。
- 死锁
多线程编程过程中,可能会用到锁,如果是多个锁的话,就可能造成死锁。
避免死锁:1.避免一个线程同时获取多个锁 2.避免一个线程在锁内同时占用多个资源 3.使用定时锁 4.对于数据库锁,加锁和解锁必须在同一个数据库连接内。
- 资源限制
例如服务器带宽2mb/s,某个资源下载速度是1mb/s,系统启动10个线程下载,下载速度也不会变成10mb/s。
多线程编程
多线程编程过程中,会遇到一些需要解决的问题,这些问题一般都有线程的api,下面总结一些这些问题
- 锁
synchronized、Lock
- 线程间的协作
wait、notify等
- 线程共享变量
volatile、ConcurrentHashMap等
- 线程管理
线程池
网友评论