自旋锁、阻塞锁、重入锁、偏向锁、轻量锁和重量锁

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_25827845/article/details/74139773



(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74139773冷血之心的博客)


以下内容摘抄整理于网络和书籍:


1、自旋锁:

采用让当前线程不停的在循环体内执行实现,当循环的条件被其它线程改变时才能进入临界区

举例如下:



优缺点分析:

由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。




2、阻塞锁:

阻塞锁改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进入线程的准备就绪状态,转为就绪状态的所有线程,通过竞争,进入运行状态。


优缺点分析:

阻塞锁的优势在于,阻塞的线程不会占用cpu时间,不会导致 CPu占用率过高,但进入时间以及恢复时间都要比自旋锁略慢。在竞争激烈的情况下 阻塞锁的性能要明显高于自旋锁。



3、重入锁:

Java中的synchronized同步块是可重入的。这意味着如果一个java线程进入了代码中的synchronized同步块,因此获得了该同步块使用的同步对象对应的管程上的锁,那么这个线程可以进入由同一个管程对象所同步的另

一个java代码块。


ReentrantLock与synchronized比较:

  1. 前者使用灵活,但是必须手动开启和释放锁
  2. 前者扩展性好,有时间锁等候(tryLock( )),可中断锁等候(lockInterruptibly( )),锁投票等,适合用于高度竞争锁和多个条件变量的地方
  3. 前者提供了可轮询的锁请求,可以尝试去获取锁(tryLock( )),如果失败,则会释放已经获得的锁。有完善的错误恢复机制,可以避免死锁的发生。
优缺点分析:

可重入锁的最大优点就是可以避免死锁。缺点是必须手动开启和释放锁。


偏向锁、轻量锁和重量锁的优缺点总结如下:




如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~



本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。





猜你喜欢

转载自blog.csdn.net/qq_25827845/article/details/74139773