Java多线程的悲观锁与乐观锁
2017-03-16 20:14
218 查看
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561376.html
一:悲观锁
悲观锁,就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加锁就会导致锁之间的争夺,有争夺就会有输赢,输者等待。
syncrhoized是一种独占锁,即:占用该锁的线程才可以执行,申请该锁的线程就只能挂起等待,直到占用锁的线程释放锁才唤醒,拿到锁并执行。由于在进程挂起和恢复执行过程中存在着很大的开销,并且当一个线程正在等待锁时,它不能做任何事。所以syncrhoized是一种悲观锁,凡是用syncrhoized加了锁的多线程之间都会因锁的争夺结果导致挂起、唤醒等开销。
二:乐观锁
获得锁后一直持有锁以防本线程再次申请该锁造成无谓的解锁再加锁开销,或者假设没有冲突而去完成同步代码块如果冲突再循环重试,或者采取申请锁失败后不立刻挂起而是稍微等待再次尝试获取 等待策略,以减少线程因为挂起、阻塞、唤醒(发生CPU的调度切换) 而造成的开销。
偏向锁、轻量级锁(CAS轮询)、自旋锁 就是基于上述思路的乐观锁。
在多线程的加锁机制中,JVM会首先尝试乐观锁,失败后才调用悲观锁。
一:悲观锁
悲观锁,就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加锁就会导致锁之间的争夺,有争夺就会有输赢,输者等待。
syncrhoized是一种独占锁,即:占用该锁的线程才可以执行,申请该锁的线程就只能挂起等待,直到占用锁的线程释放锁才唤醒,拿到锁并执行。由于在进程挂起和恢复执行过程中存在着很大的开销,并且当一个线程正在等待锁时,它不能做任何事。所以syncrhoized是一种悲观锁,凡是用syncrhoized加了锁的多线程之间都会因锁的争夺结果导致挂起、唤醒等开销。
二:乐观锁
获得锁后一直持有锁以防本线程再次申请该锁造成无谓的解锁再加锁开销,或者假设没有冲突而去完成同步代码块如果冲突再循环重试,或者采取申请锁失败后不立刻挂起而是稍微等待再次尝试获取 等待策略,以减少线程因为挂起、阻塞、唤醒(发生CPU的调度切换) 而造成的开销。
偏向锁、轻量级锁(CAS轮询)、自旋锁 就是基于上述思路的乐观锁。
在多线程的加锁机制中,JVM会首先尝试乐观锁,失败后才调用悲观锁。
相关文章推荐
- Java多线程:乐观锁、悲观锁、自旋锁
- java 多线程 乐观锁悲观锁
- Java多线程:乐观锁、悲观锁
- Java多线程-线程安全思路拓展-Atomic数值类-Volatile以及CAS乐观锁
- [置顶] java乐观锁与悲观锁
- Java的悲观锁与乐观锁
- Java 中的悲观锁和乐观锁的实现
- java 乐观锁与悲观锁
- Java高效并发之乐观锁悲观锁、(互斥同步、非互斥同步)
- java 5多线程乐观锁CAS之于悲观锁synchronized
- 【JavaWeb-21】多对多关系、类和关联级别的加载策略、HQL查询详解、Hibernate连接池配置、Hibernate里悲观锁乐观锁使用
- Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
- 多线程之 悲观锁,乐观锁
- Java 中的悲观锁和乐观锁的实现
- Java 中的悲观锁和乐观锁的实现
- Java 中的悲观锁和乐观锁的实现
- Java 中的悲观锁和乐观锁的实现
- Java中乐观锁与悲观锁的实现
- Java 中的悲观锁和乐观锁的实现
- Java 中的悲观锁和乐观锁的实现