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

Java 乐观锁与悲观锁

1. 前言

本节内容主要是对 Java 乐观锁与悲观锁进行更加深入的讲解,本节内容更加偏重于对乐观锁的讲解,因为 synchronized 悲观锁对于大部分学习者并不陌生,本节主要内容如下:

  • 乐观锁与悲观锁的概念,之前有所讲解,这里用很小的篇幅进行知识的回顾,巩固;
  • 乐观锁与悲观锁的使用场景介绍,通过理解悲观锁与乐观锁不同的风格,理解什么场景下需要选择合适的锁,为本节的重点内容之一;
  • 了解乐观锁的缺点,乐观锁有自己的特定的缺陷,不同的锁都有自己的优点与缺点;
  • 了解乐观锁缺陷的解决方式,作为本节内容的重点之一;
  • 通过引入 Atomic 操作,实现乐观锁,为本节内容的核心,通过对比 synchronized 的实现,用两种锁机制实现同一个需求。

本节内容为 CAS 原理的进阶讲解,也是乐观锁与悲观锁的深入讲解。因为对于并发编程,悲观锁与乐观锁的涉及频率非常高,所以对其进行更加深入的讲解。

2. 乐观锁与悲观锁的概念

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样其他线程想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。

乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CAS 算法实现。

乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于 write_condition 机制,其实都是提供的乐观锁。

3. 乐观锁与悲观锁的使用场景

简单的来说 CAS 适用于写比较少的情况下(多读场景,冲突一般较少),synchronized 适用于写比较多的情况下(多写场景,冲突一般较多)。

  • 对于资源竞争较少(线程冲突较轻)的情况,使用 synchronized 同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗 CPU 资源;而 CAS 基于硬件实现,不需要进入内核,不需要切换线程,
http://www.lryc.cn/news/392154.html

相关文章:

  • python学习2-数据结构与算法-链表
  • 项目一 nfs 共享服务器 Haproxy 代理 Keepalive 高可用集群
  • TCP粘包解决方法
  • 高职人工智能专业实训课之“生成对抗网络(GAN)”
  • 【MySQL系列】隐式转换
  • 亿发:信息化建设or面子工程?究竟什么才是真正的信息化解决方案
  • 【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(1)
  • 树形结构C语言的实现
  • 小程序渗透测试的两种方法——burpsuite、yakit
  • 代码随想录训练营Day56
  • S32K3 工具篇4:如何在S32DS中使用lauterbach下载
  • 深度神经网络语言识别
  • STM32自己从零开始实操07:电机电路原理图
  • 网页计算器的实现
  • JAVA设计模式-监听者模式
  • anaconda命令大全
  • “论单元测试方法及应用”写作框架,软考高级论文,系统架构设计师论文
  • 基于布雷格曼偏差校正技术的全变分一维时间序列信号降噪方法(MATLAB R2018A)
  • 【CentOS 7.6】Linux版本 portainer本地镜像导入docker安装配置教程,不需要魔法拉取!(找不着镜像的来看我)
  • 【windows|012】光猫、路由器、交换机详解
  • Node之Web服务
  • [Day 24] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • 计算机图形学入门25:BRDF的测量
  • 空调计费系统是什么,你知道吗
  • 震惊!张宇25版高数18讲发布,656页惹争议!
  • React+TS前台项目实战(二十三)-- 基于属性自定义数值显示组件Decimal封装
  • pip install包出现哈希错误解决
  • 多线程压测方法模板
  • Uniapp软件库全新带勋章功能(包含前后端源码)
  • 秋招突击——7/5——设计模式知识点补充——适配器模式、代理模式和装饰器模式