生活

晴。

悲观与乐观的情绪概念

本篇来了解一下悲观锁和乐观锁,在了解这两个锁之前,我们首先有必要把悲观和乐观这两个词搞清楚:
悲观:对世事怀有消极的看法,认为事物总往糟糕的方向发展。
乐观:对世事怀有积极的态度,认为事物总往好的方向发展。

何为悲观锁

悲观锁:
假定会发生并发的冲突,因此屏蔽一切可能违反数据完整性的操作。
在整个数据处理过程中,锁定要操作的数据。

悲观锁的实现(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并发编程:悲观锁与乐观锁相关推荐

  1. Java并发编程-ReentrantLock可重入锁

    目录 1.ReentrantLock可重入锁概述 2.可重入 3.可打断 4.锁超时 5.公平锁 6.条件变量 Condition 1.ReentrantLock可重入锁概述 相对于 synchron ...

  2. Java 并发编程之可重入锁 ReentrantLock

    Java 提供了另外一个可重入锁,ReentrantLock,位于 java.util.concurrent.locks 包下,可以替代 synchronized,并且提供了比 synchronize ...

  3. Java并发编程进阶——并发锁

    1 JAVA 多线程锁介绍 1.1 悲观锁 定义:悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改(很悲观),所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于 ...

  4. Java 并发编程CAS、volatile、synchronized原理详解

    CAS(CompareAndSwap) 什么是CAS? 在Java中调用的是Unsafe的如下方法来CAS修改对象int属性的值(借助C来调用CPU底层指令实现的): /*** * @param o ...

  5. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

    何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...

  6. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...

  7. 悲观锁的实现方式java_并发编程--锁--悲观锁和乐观锁

    悲观锁和乐观锁并不是某个具体的"锁"而是一种并发编程的基本概念,是根据看待并发同步的角度.乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入. 悲观锁 ...

  8. 并发编程的悲观锁和乐观锁

    悲观锁和乐观锁 是并发情境下的两种设计思想, 它们的主要区别在于: 悲观锁则认为肯定会发生并发问题, 要么我等着, 要么就让别人等; 乐观锁认为当前发生并发的可能性不大, 我先试试, 不行的话再说. ...

  9. 探索JAVA并发 - 悲观锁和乐观锁

    作者:acupt,专注Java,架构师社区合伙人! 什么是悲观锁,什么是乐观锁,它们是如何实现的? 定义 悲观锁:对世界充满不信任,认为一定会发生冲突,因此在使用资源前先将其锁住,具有强烈的独占和排他 ...

最新文章

  1. MPB:西农焦硕组-​土壤微生物响应环境变化的系统发育保守性和环境阈值
  2. Android 透明度百分比对应的 十六进制
  3. 程序是什么--过滤器和状态机
  4. go mysql 乱码_MySQL 乱码之我见
  5. Python 技术篇-利用pyperclip库实现读取写入剪切板,超简单
  6. 解决Keepalived脚本启动时warning、Unsafe
  7. 【渝粤题库】国家开放大学2021春2322物流信息技术题目
  8. 单片机的内存分配(变量的存储位置)详解
  9. Javaimport以及Java类的搜索路径
  10. python的random模块怎么写_Python常用标准库之random模块
  11. 单肩包属于什么类目_Lazada时尚类目成为优势类目?
  12. spring cloud构建互联网分布式微服务云平台-服务注册与发现
  13. UI05 - UILabel05
  14. C# Lamda中类似于SQL 中的 In 功能
  15. linux进程通信 bzero函数,处理Linux网络编程中的IP地址 — 通信产业...
  16. 【HarmonyOS HiSpark IPC DIY Camera试用连载2 】一天内极速完成从开箱编译烧写到跑通hello world
  17. 【opencv】viz 3D虚拟空间模块编译及使用
  18. 黑马程序员-我的入学笔记1-关于C#.net基础
  19. 1625 夹克爷发红包(二进制枚举运用)
  20. java ssi_快速部署SSI框架

热门文章

  1. mac 文件隐藏加密工具_如何在照片内部加密和隐藏您的个人文件
  2. 西安工程大学c语言试卷,C语言程序设计(西安工程大学)2020知到章节测试题答案...
  3. 微信拼团小程序源码带后台Mysql数据库
  4. 【VUE】在vue中使用google地图
  5. MySQL异构同步_详解MySQL数据库异构数据同步
  6. scp 保留文件属组_scp传输文件的权限问题
  7. 第十七节:通信之WLAN(WPA3-Ⅰ)
  8. 谷歌Cartographer的论文研读(一)
  9. apt-get: command not found解决方案
  10. 【报告分享】2020快手母婴生态报告-快手大数据研究院(附下载)