码迷,mamicode.com
首页 > 编程语言 > 详细

【Java多线程】悲观锁 与 乐观锁

时间:2017-03-16 21:25:52      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:轻量级   进程   占用   解锁   bsp   sync   同步代码块   加锁   自旋锁   

    一:悲观锁

      悲观锁,就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加锁就会导致锁之间的争夺,有争夺就会有输赢,输者等待。

      syncrhoized是一种独占锁,即:占用该锁的线程才可以执行,申请该锁的线程就只能挂起等待,直到占用锁的线程释放锁才唤醒,拿到锁并执行。由于在进程挂起和恢复执行过程中存在着很大的开销,并且当一个线程正在等待锁时,它不能做任何事。所以syncrhoized是一种悲观锁,凡是用syncrhoized加了锁的多线程之间都会因锁的争夺结果导致挂起、唤醒等开销。

 

    二:乐观锁

      获得锁后一直持有锁以防本线程再次申请该锁造成无谓的解锁再加锁开销,或者假设没有冲突而去完成同步代码块如果冲突再循环重试,或者采取申请锁失败后不立刻挂起而是稍微等待再次尝试获取 等待策略,以减少线程因为挂起、阻塞、唤醒(发生CPU的调度切换) 而造成的开销。

      偏向锁、轻量级锁(CAS轮询)、自旋锁 就是基于上述思路的乐观锁。

 

      在多线程的加锁机制中,JVM会首先尝试乐观锁,失败后才调用悲观锁。

【Java多线程】悲观锁 与 乐观锁

标签:轻量级   进程   占用   解锁   bsp   sync   同步代码块   加锁   自旋锁   

原文地址:http://www.cnblogs.com/ygj0930/p/6561376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!