一.多线程一定比单线程快吗?
在《Java并发编程艺术》开篇中提到,若操作数据量不超过百万次,那么并发执行是比串行执行慢的。是因为线程有创建和上下文切换的开销。
- 那么什么是上下文切换呢
单核CPU支持多线程执行,但是它并不是像我们想象的那样是同一时间执行多个线程,而是通过对每个线程进行时间片的分配,以至于不停的切换线程执行。从而让我们感觉CPU是在同时执行多个线程。也就是说其实在一个时间片内,CPU执行的只是一个线程。但是,在两个时间片之间切换线程的时候CPU会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换。
二.既然上下文切换会导致额外的开销,那么怎么减少上下文的切换?
- 无锁并发编程:
定义:无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步。即在没有线程阻塞的情况下实现同步。这样可以避免竞态、死锁等问题。
推荐下面一篇博客,个人感觉讲的还是比较详细
无锁和无等待的定义和例子 - CAS算法:
CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
同样在这推荐一篇较好的博客:
深入理解CAS算法原理 - 使用最少线程:避免创建不需要的线程
- 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务之间的调度
三.避免死锁的几个办法
- 避免一个线程同时获取多个锁
- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占一个资源
- 尝试使用定时锁来代替内部锁机制
- 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况