Java多线程悲观锁 与 乐观锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程悲观锁 与 乐观锁相关的知识,希望对你有一定的参考价值。

    一:悲观锁

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

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

 

    二:乐观锁

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

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

 

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

以上是关于Java多线程悲观锁 与 乐观锁的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程——锁概念与锁优化

Java多线程:乐观锁悲观锁自旋锁

java中悲观锁和乐观锁的区别

java多线程进阶同步锁

悲观锁与乐观锁以及如何用java语言和mysql实现

6.23Java多线程CAS原子操作