自旋锁是为实现保护共享资源而提出一种轻量级的锁机制。自旋锁属于互斥锁的一种,都是为了解决某项资源的互斥使用。
理解:线程A正在占用CPU使用时,线程B也想要占用CPU,但此时A已经加了使用标志(锁),那么B就可以有不同的操作
占用。不断循环并测试锁的状态,线程不会挂起(睡眠),处于忙等状态,采用这种行为的锁叫做自旋锁。
等待。线程B休眠阻塞,放弃CPU,直到A执行完了,锁没了,再使用内存。这种行为叫做互斥锁。
无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个拥有者,也就说,在任何时刻最多只能有一个线程获得锁。但是两者在调度机制上有很大的不同。对于互斥锁,如果互斥锁已经被占有,申请者只能进入睡眠状态。但是自旋锁不会引起申请者睡眠,如果自旋锁已经被别的线程占有,申请者就一直在那里循环判断该自旋锁的拥有者是否已经释放了该锁, “自旋”一词就是因此而得名。
互斥锁:用于保护临界区,确保同一时间只有一个线程访问数据。对共享资源的访问,先对互斥量进行加锁,如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
自旋锁:与互斥量类似,它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(自旋)阻塞状态。用在以下情况:锁持有的时间短,而且线程并不希望在重新调度上花太多的成本。"原地打转"。
区别:线程在申请自旋锁的时候,线程不会被挂起,而是处于忙等的状态。
自旋锁适用于锁使用者保持锁时间比较短的情况。信号量适用于保持锁时间较长的情况。自旋锁不会引起调用者睡眠,因此其效率远高于互斥锁,但自旋锁一直占用着CPU,如果不能在短时间内获得锁就会使CPU的效率降低,且容易造成死锁。