前言
我们从一个问题引入今天的主题。
在日常业务开发中,我们可能经常听到 DBA 对我们说“不要”(注意:不是禁止)使用 join
,那么为什么 DBA 对 join 这么抵触呢?是 join 本身有问题,还是我们使用的方式不对。
其实这涉及到 join 语句在 MYSQL 内部到底是怎么执行的。
这就是我们今天要讲的内容。
1、上下文切换
上下文定义
cpu发生进程或者线程切换时,所依赖的数据集合,比如一个函数有外部变量,函数运行时,必须获取外部变量,这些变量值的集合就是上下文。
引发问题
对于CPU密集型任务,多线程处理会发生上下文切换,会影响到执行速度,如果时IO密集型,多线程技术优点尽显。
如何减少上下文切换
- 无锁并发编程,锁的获取与释放会发生上下文切换,多线程时会影响效率。无锁并发编程就是将数据分块,每个线程处理各自模块。比如LongAdder中部分代码。
- CAS算法,并发编程时通过CAS算法更新数据,而不必加锁。如Java的atomic包下的工具类。
- 使用最少线程,减少不必要的线程创建,自定义线程池。
- 使用协程,在单线程中维护多任务调度,处理任务间切换,Golang对于协程的使用很强大。
2、死锁
死锁定义
死锁是进程死锁的简称&