自旋锁
自旋锁通过CPU提供的CAS,在用户态完成加锁和解锁操作,不会产生线程上下文切换,所以相比互斥锁来说,会快一些,开销小一些。加锁过程的话,CPU去查看锁的状态,若是空闲的则将锁设置为当前线程持有,如果锁的状态是别的线程所持有,那么就会发生自旋,也就是再次判断锁是否被持有,直到获取到锁。缺点就是得一直占用CPU。
互斥锁
互斥锁是一种独占锁,当线程A加锁成功后,此时互斥锁已经被线程A独占了,只要线程A没有释放手中的锁,线程B就会失败,就会释放掉CPU给其他线程,线程B加锁的代码就会被阻塞。其中需要两次的线程上下文切换,当线程加锁失败,内核将线程的状态从运行切换到睡眠状态,然后把CPU切换给其他线程运行,当锁被释放时,之前睡眠状态的线程就会变成就绪状态,然后内核就会在合适的时间把CPU切换给该线程运行。
