JAVA并发编程:悲观锁与乐观锁
生活
晴。
悲观与乐观的情绪概念
本篇来了解一下悲观锁和乐观锁,在了解这两个锁之前,我们首先有必要把悲观和乐观这两个词搞清楚:
悲观:对世事怀有消极的看法,认为事物总往糟糕的方向发展。
乐观:对世事怀有积极的态度,认为事物总往好的方向发展。
何为悲观锁
悲观锁:
假定会发生并发的冲突,因此屏蔽一切可能违反数据完整性的操作。
在整个数据处理过程中,锁定要操作的数据。
悲观锁的实现(JAVA/数据库)
悲观锁的实现方式:
JAVA:
synchronized /lock
数据库:
mysql:
select … for update .
如果拿不到锁就等待。
注意:mysql查询扫描到的所有行都会被上行锁,因此mysql在使用悲观锁时务必要用到索引,避免全表扫描,减少扫描行数。
oracle:
select … for update (no wait)
注意:oracle 的悲观锁 有一个no wait 的选项,即当获取不到锁时不等待直接返回。
乐观锁
乐观锁:
假定不会发生并发冲突,因此只在提交数据操作时才执行数据完整性一致性的检查。
乐观锁不能解决脏读。
乐观锁的体现(JAVA/数据库)
乐观锁其实就是通过CAS不断自旋,CAS即compareAndSwap:
执行函数:CAS(V,E,N)
V是要执行的变量,
E是期望值
N是新值。
当E不一致时说明有其他线程修改了该值,那么该线程修改失败,继续CAS。直到成功。
乐观锁的实现:
JAVA:
原子类、AQS
数据库:
SELECT … WHERE version = #version#
使用场景
乐观锁:适用于读多写少的场景。
悲观锁:适用于写多读少的场景。
实际如何选择
需要结合这两种锁的特点,进行合理的选择
-响应速度:选择乐观锁。要么冲突失败要么快速成功。悲观锁则需要等待释放锁才能被执行
-冲突频率:频率高的话不应选择乐观锁,需要重试好几次,代价大。而悲观锁保证成功率
-重试代价:若重试代价大则选择悲观锁
后记
明天看下乐观锁下 CAS的ABA问题~
JAVA并发编程:悲观锁与乐观锁相关推荐
- Java并发编程-ReentrantLock可重入锁
目录 1.ReentrantLock可重入锁概述 2.可重入 3.可打断 4.锁超时 5.公平锁 6.条件变量 Condition 1.ReentrantLock可重入锁概述 相对于 synchron ...
- Java 并发编程之可重入锁 ReentrantLock
Java 提供了另外一个可重入锁,ReentrantLock,位于 java.util.concurrent.locks 包下,可以替代 synchronized,并且提供了比 synchronize ...
- Java并发编程进阶——并发锁
1 JAVA 多线程锁介绍 1.1 悲观锁 定义:悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改(很悲观),所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于 ...
- Java 并发编程CAS、volatile、synchronized原理详解
CAS(CompareAndSwap) 什么是CAS? 在Java中调用的是Unsafe的如下方法来CAS修改对象int属性的值(借助C来调用CPU底层指令实现的): /*** * @param o ...
- **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...
何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...
- Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...
- 悲观锁的实现方式java_并发编程--锁--悲观锁和乐观锁
悲观锁和乐观锁并不是某个具体的"锁"而是一种并发编程的基本概念,是根据看待并发同步的角度.乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入. 悲观锁 ...
- 并发编程的悲观锁和乐观锁
悲观锁和乐观锁 是并发情境下的两种设计思想, 它们的主要区别在于: 悲观锁则认为肯定会发生并发问题, 要么我等着, 要么就让别人等; 乐观锁认为当前发生并发的可能性不大, 我先试试, 不行的话再说. ...
- 探索JAVA并发 - 悲观锁和乐观锁
作者:acupt,专注Java,架构师社区合伙人! 什么是悲观锁,什么是乐观锁,它们是如何实现的? 定义 悲观锁:对世界充满不信任,认为一定会发生冲突,因此在使用资源前先将其锁住,具有强烈的独占和排他 ...
最新文章
- MPB:西农焦硕组-​土壤微生物响应环境变化的系统发育保守性和环境阈值
- Android 透明度百分比对应的 十六进制
- 程序是什么--过滤器和状态机
- go mysql 乱码_MySQL 乱码之我见
- Python 技术篇-利用pyperclip库实现读取写入剪切板,超简单
- 解决Keepalived脚本启动时warning、Unsafe
- 【渝粤题库】国家开放大学2021春2322物流信息技术题目
- 单片机的内存分配(变量的存储位置)详解
- Javaimport以及Java类的搜索路径
- python的random模块怎么写_Python常用标准库之random模块
- 单肩包属于什么类目_Lazada时尚类目成为优势类目?
- spring cloud构建互联网分布式微服务云平台-服务注册与发现
- UI05 - UILabel05
- C# Lamda中类似于SQL 中的 In 功能
- linux进程通信 bzero函数,处理Linux网络编程中的IP地址 — 通信产业...
- 【HarmonyOS HiSpark IPC DIY Camera试用连载2 】一天内极速完成从开箱编译烧写到跑通hello world
- 【opencv】viz 3D虚拟空间模块编译及使用
- 黑马程序员-我的入学笔记1-关于C#.net基础
- 1625 夹克爷发红包(二进制枚举运用)
- java ssi_快速部署SSI框架
热门文章
- mac 文件隐藏加密工具_如何在照片内部加密和隐藏您的个人文件
- 西安工程大学c语言试卷,C语言程序设计(西安工程大学)2020知到章节测试题答案...
- 微信拼团小程序源码带后台Mysql数据库
- 【VUE】在vue中使用google地图
- MySQL异构同步_详解MySQL数据库异构数据同步
- scp 保留文件属组_scp传输文件的权限问题
- 第十七节:通信之WLAN(WPA3-Ⅰ)
- 谷歌Cartographer的论文研读(一)
- apt-get: command not found解决方案
- 【报告分享】2020快手母婴生态报告-快手大数据研究院(附下载)