自旋锁(spinlock)
概念:是指尝试获取锁的线程不会立即阻塞,:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环.
获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting
它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名
这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU.
举个栗子
此时相当于一把锁
spinLock代码
控制台
思考
自旋锁与普通的锁以及信号量不同,使用普通的锁和信号量在访问资源必须等待的时候操作系统会先把等待的线程加入相应的锁的链表里,然后挂起该线程,挂起后直到有线程释放了对应的锁才有机会获得CPU。而自旋锁则不同,它在等待锁时会循环检测锁是否开启,这对于单处理器来说是浪费CPU,但是在多处理器环境下,不同cpu上的线程同时操作一段临界资源,如果操作只需要很短的时间,(比如改变一个变量的值)循环的代价会少于把线程加入锁的队列及线程切换的代价,这种情境下应该使用自旋锁。
自旋锁的应用条件:
1,临界的代码短;
2,多处理器;
当有大量线程依赖于一个锁时需谨慎思考临界代码占用的百分比