当前位置: 首页 > news >正文

乐观锁与悲观锁

乐观锁与悲观锁


悲观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。如,synchronized关键字使用。

乐观锁

假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。如,CAS(Compare and Swap 比较并交换)。

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

CAS介绍

  1. CAS 操作中包含三个操作数

    • 需要读写的内存值
    • 进行比较的预期值
    • 拟写入的新值
  2. 原理

    当且仅当预期值和内存值相等时才将内存值修改为新值。首先检查某块内存的值是否跟之前读取时的一样,如不一样则表示期间此内存值已经被别的线程更改过,舍弃本次操作;否则说明期间没有其他线程对此内存值操作,可以把新值设置给此块内存。

  3. 问题

  • 只能保证一个共享变量的原子操作

    JDK提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在一个对象里来进行CAS操作。

  • 循环时间长、开销大

    自旋CAS(不成功,就一直循环执行,直到成功)。

  • ABA问题

    内存值原来是A,后来被一条线程改为B,最后又被改成了A。

    解决方法:引入版本号,更新变量同时修改版本号。

转载于:https://www.cnblogs.com/wscy/p/9415245.html

相关文章:

  • NOIP2017提高组Day2第一题
  • C++ system函数学习(转)
  • Java IO简介
  • python全栈脱产第9天------定义函数的形式、调用函数的形式、函数的返回值、函数参数...
  • SVG和canvas的区别
  • PL/SQL程序设计(二)—— PL/SQL块结构和组成元素
  • day24 面向对象设计part1
  • 无监督学习:Deep Auto-encoder(深度自动编码器)
  • UVALive 4108 - SKYLINE(线段树区间更新)
  • PDO和MySQLi区别和数度;到底用哪个?
  • android 换行符(\n) 在TextView中显示不正常的问题
  • App上线-Missing App Store Icon
  • Windows 环境Oracle客户端下载安装
  • datetime模块的简单用法
  • JVM 内存解析,以及自己的一些见解
  • php的引用
  • hexo+github搭建个人博客
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【347天】每日项目总结系列085(2018.01.18)
  • canvas 五子棋游戏
  • js作用域和this的理解
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • ReactNative开发常用的三方模块
  • Shell编程
  • spring-boot List转Page
  • Vue 重置组件到初始状态
  • Yii源码解读-服务定位器(Service Locator)
  • 面试遇到的一些题
  • 配置 PM2 实现代码自动发布
  • 如何用纯 CSS 创作一个货车 loader
  • # centos7下FFmpeg环境部署记录
  • (LeetCode C++)盛最多水的容器
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三) diretfbrc详解
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • ./configure、make、make install 命令
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .cfg\.dat\.mak(持续补充)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net Core和.Net Standard直观理解
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [BJDCTF 2020]easy_md5
  • [bzoj2957]楼房重建
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [GXYCTF2019]BabyUpload1 -- 题目分析与详解
  • [JS]Math.random()随机数的二三事
  • [leetcode]Clone Graph
  • [LOJ 6213]「美团 CodeM 决赛」radar
  • [No000016]为什么假期计划总是做不到?