17 自旋锁和自适应自旋锁有什么区别

自旋锁的概念: 阻塞或唤醒一个java线程需要操作系统切换cpu状态来完成,这种状态装换需要耗费处理器的时间。如果同步代码块中的内容过于简单,状态转换消耗的时间有可能比用户执行代码的时间还要长。 在许多场景下,同步资源的锁定时间较短,为了这一小段时间去切换线程,线程挂起和恢复线程花费可能会让系统得不偿失。如果物理机器有多个处理器,能让2个或者多个线程同时并行执行。我们可以让后面那个请求锁的线程不放弃cpu的执行时间,看看持有锁的线程是否会很快就会释放锁。 而为了让当前线程 "稍等一下",我们需要让当前线程锁自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程不必阻塞而是直接获取同步资源,从而避免切换线程的开销。这就是自旋锁。 自旋锁的缺点: 自旋锁本身是有缺点的,他不能代替阻塞,自旋等待虽然避免了线程切换的开销,但是他要占用cpu处理器的时间,如果锁被占用的时间很短,自旋等待的效果就会非常好。反之,如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器的资源。所以,自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数(默认是10次,可以用 -XX:PreBlockSpin来更改)没有成功获得锁,就应该挂起线程。自旋锁的原理同样也是cas。 适应性自旋锁:自适应意味着自旋的时间(次数)不在固定,而是由前一次在同一个锁上的自旋时间以及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在执行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而他讲允许自旋等待的持续相对更长的时间。如果对于某个锁,自旋很少成功获得过,那子啊以后尝试获取这个锁时将可能省略自旋过程,直接阻塞线程,避免浪费处理器资源。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章