自旋锁的介绍
自旋锁是指线程在获取锁的时候,当前锁被其他线程占用还未释放,那么当前线程会进入循环(for循环,while循环),一直重复获取锁的状态,而不会进入挂起或者睡眠等状态。当锁被释放后,当前线程获取到该锁的执行权,则会跳出循环执行相关代码。
自旋锁的优缺点
优点: 自旋情况下可以减少上下文之间的切换。
缺点: 一直循环会增加CPU的消耗。
自旋锁&&非自旋锁的区别
自旋锁:自旋锁的意思就是自我旋转,在Java中就是进行循环,通过循环不停的获取锁的状态,线程不需要挂起或者睡眠等待,不需要通过系统唤醒。这种带来的好处是:因为线程的阻塞和唤醒是需要资源开销的,如果线程所执行的任务(代码)并不是很复杂,那么在这种情况下,线程切换带来的资源消耗比执行任务的消耗更大。
非自旋锁:就是当线程需要获取锁的时候,如果锁被其他线程占用,那么当前线程会进行等待挂起。需要通过CPU进行唤醒。
总结
由于自旋锁只是在当前线程不停的执行循环体,不需要进行线程状态的切换,因此相应时间很快,但是随着线程数量的增加,效率则会显著降低,因为每个线程都需要消耗CPU性能。所以,如果线程竞争不是很激烈,且锁的持有时间不是很长,这种情况下可以使用自旋锁。