原子性 以及悲观锁, 乐观锁

news2024/11/17 13:23:01

1. 前言

今天这篇文章要详细的说说,什么叫原子性,以及如果不是原子性的话,怎么能保证原子性。

2. 原子性

  1. 先说下并发编程的三大特性:可见性, 有序性, 原子性。 无论是在什么语言,原子性都是非常重要的,既然是这么晦涩的概念,那什么是原子性呢???
  2. 先来讲述下概念:一组动作,要么都成功,要么都失败,其目的是为了保证数据的一致性。 这个怎么理解呢??? 比如:银行要将用户A的钱转给用户B. 如果A的钱扣除成功了,但是用户B的钱转账失败了,会怎么办呢,是不是数据跟我们预想的就不一致了. 如果还是不能理解的话,可以想想Java开发时的Mysql事务,其实也是一个道理。

2.1 实例讲述

    private static int count = 0;
    private static Object o = new Object();

    public static void test01() throws InterruptedException {
        int MAX_COUNT = 100;
        Thread[] threads = new Thread[MAX_COUNT];
        CountDownLatch countDownLatch = new CountDownLatch(MAX_COUNT);

        for (int i = 0; i < MAX_COUNT; i++) {
            threads[i] = new Thread(() -> {
//                synchronized (o) {
                    for (int j = 0; j < 100; j++) {
                        count ++;
                    }
                    countDownLatch.countDown();
//                }
            });
        }

        for (Thread thread : threads) {
            thread.start();
        }

        countDownLatch.await();
        System.out.println(count);
    }

大家可以看看上面的实例,结果是不是每次都是10000. 其实结果不是的,为什么会出现这种情况呢???

其实是并发线程导致的,大家可以看看上述计数的位置n ++. 千万不要以Java的角度来看代码,因为Java的代码计算机不识别的。 看如下图:

在这里插入图片描述
简简单单的一句话i ++被翻译为汇编语言后,就这么多句话。而运算语句i ++. 可以简简单单分为三句话取值 => 运算 => 设置值

既然是分为多行语句,所以运行到任何一句语句中都可能被别的线程截断的。

换言之,整个i ++ 是不能作为一个整体而运行的。这就是不能保证所谓的原子性。

那我们最终的目的就很简单了,就是保证执行过程的原子性,如何保证原子性呢??? 对了, 上锁

2.2 锁的本质

这里先揭晓答案:锁的本质是:并发编程的序列化。 那什么叫并发编程的。其实大家可以理解为100+人同时上厕所,这样大家都很快能解决完,但是估计会很挤,而且从道德上而言就不允许这样。

那我们怎么办呢??? 就是通过维持秩序来一个一个上厕所。这样其实也是可以都上厕所的,但是就是整个过程会变慢了。 其实这就是锁的本质。

在这里插入图片描述

3. 乐观锁 以及悲观锁

多线程访问数据 ==> 竞争条件 ==> 导致数据不一致, 怎么办呢??? ==> 线程同步(将线程的执行顺序安排好) ==> 加锁

3.1 悲观锁

  1. 悲观的认为:一个操作的执行一定会被别的线程打断的,所以一般我们的上锁 都是悲观锁。一言不合就上锁
  2. 直接上锁,并发线程对于同一把锁 保持同步

3.2 乐观锁

  1. 乐观的认为:某一个操作是不会被别的线程打断的。(乐观锁 又称 是自旋锁 以及无锁
  2. 既然是无锁是怎么保证执行的顺序的呢??? 添加version + 每次计算后对比version + 如果version不一致的话,重新进行计算

3.3 JVM中两种锁

  • 重量级锁(经过操作系统的调度)synchronized早期都是这种锁(目前的实现中升级到最后也是这种锁)
  • 轻量级锁(CAS的实现,不经过OS调度)(无锁 - 自旋锁 - 乐观锁)

4. 总结

今天的目的是:更多的以具体实例来详解说明了原子性。 同时也是普及了乐观锁 以及悲观锁的概念。如果大家觉得有什么不足的地方,欢迎评论区及时留言交流啊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elasticsearch 的基本操作多维度分享

目录 一、索引操作 二、映射操作 三、文档操作 elasticsearch 的基本操作多维度分享此篇正式分享&#xff0c;具体包括索引、映射、文档的相关处理&#xff0c;模拟生成环境&#xff0c;通过DSL语句和java的高级REST形式全方位展示给大家&#xff1b; 一、索引操作 1、创建…

2023超好用的Mac清理优化工具CleanMyMacX

CleanMymac X Mac版本&#xff0c;以一种全面的方式扫描Mac系统以允许垃圾隐藏&#xff0c;您只需要轻松单击左鼠标按钮即可清洁数字G的垃圾&#xff0c;这是如此简单。立即提高您的MAC速度。为Apple System计算机建造可以帮助用户清理多种类型的垃圾和其他恶意束&#xff0c;提…

Sentinel 控制台安装与详解

Sentinel 控制台包含如下功能: 查看机器列表以及健康情况&#xff1a;收集 Sentinel 客户端发送的心跳包&#xff0c;用于判断机器是否在线。监控 (单机和集群聚合)&#xff1a;通过 Sentinel 客户端暴露的监控 API&#xff0c;定期拉取并且聚合应用监控信息&#xff0c;最终可…

AIGC + 任意应用情景组合,从技术层面给了大家体验不同领域的创作的机会

还在为学技术的时候面对一大堆教程苦恼&#xff1f;画画、剪辑、建模 ... 啥啥啥都想学 &#x1f92f;AIGC 来解决&#xff01;&#xff01;每个人都有机会当五分钟艺术家&#xff01;AIGC 究竟有多强大&#xff1f;简单用一个公式来概况 AIGC 的强大之处&#xff0c;就是 AIG…

Harbor 镜像仓库

目录 一、Harboar概述 1.1 什么是 Harbor 1.2 Harbor优势 1.3 Harbor构成 1.4 Harbor的误区 二、Harbor 安装&#xff08;http&#xff09; 2.1 两种方式 2.2 具体安装步骤 2.2.1 先安装Docker和Docker Compose 2.2.2 下载Harbor 2.2.3 harbor.yml 的hostname 2.2.…

梳理一下我在2022年读过的23本书

作者 | gongyouliu编辑 | gongyouliu2022年我一共看了23本书&#xff0c;比自己之前定的目标——每年看36本书——少了不少。今天特意花大半天时间写一篇文章来整理一下今年看的书&#xff0c;梳理一下自己的思路&#xff0c;也算是留下一份记录。这份书单也希望给大家作为参考…

从这两道题重新理解,JS的this、作用域、闭包、对象

日常开发中&#xff0c;我们经常用到this。例如用Jquery绑定事件时&#xff0c;this指向触发事件的DOM元素&#xff1b;编写Vue、React组件时&#xff0c;this指向组件本身。对于新手来说&#xff0c;常会用一种意会的感觉去判断this的指向。以至于当遇到复杂的函数调用时&…

spring、mybatis、spring-mybatis、springboot-mybatis的配置文件

第一个Spring程序 第一个Mybatis程序 第一个Spring-Mybatis程序 第一个SpringBoot-Mybatis程序 1. Spring程序配置文件 beans.xml&#xff1a;/resources <!--注册一个Bean--><bean id"hello" class"com.kuang.pojo.Hello"><property nam…

03 I2C

特点 两根线 SCL SDA同步、半双工带数据应答支持总线挂载多设备 一主多从 多主多从 两个功能&#xff1a; 读取外设模块指定位置的寄存器写外设模块指定位置的寄存器一个完整的通讯协议一定是在软件和硬件上同时定义的。 硬件 所有的I2C设备的时钟线与数据线都要连在一起设备…

普元技术专家2022历史文章合集

大家好&#xff0c;新年快乐。‍献上2022年历史文章合集&#xff0c;方便你翻阅过去一年里的精华文章。【第一辑】企业服务总线&#xff08;ESB&#xff09;基于ESB的企业服务集成平台建设之道企业服务总线建设之道的探索与研究零代码能力干掉80%开发工作&#xff1a;普元ESB 8…

论文综述——Event-Event Relation Extraction using Probabilistic Box Embedding

Event-Event Relation Extraction using Probabilistic Box Embedding1 任务介绍2 Box Embedding3 BERE模型4 实验5 总结1 任务介绍 事件关系抽取&#xff1a;文本中包含多个事件e1,e2,…,en&#xff0c;识别每个事件对(ei,ej)之间的关系r(ei,ej) 子事件(Subevent)关系抽取&a…

(一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>

一、工作环境及项目简介 立创EDA&#xff1a;硬件原理图及PCB绘制。 全志F1C200S&#xff1a;F1C100S内置32MB DDR1内存&#xff0c;F1C200S内置64MB DDR1内存。 原理图&#xff1a;参考开源项目&#xff0c;详见墨云&#xff0c; 详见peng-zhihui。 核心板&#xff1a;四层…

Java8 - Streams flatMap()

文章目录What is flatMap()?Why flat a Stream?DemoWhat is flatMap()? # Stream<String[]> # Stream<Stream<String>> # String[][][[1, 2],[3, 4],[5, 6] ]它由一个 2 级 Stream 或一个二维数组组成 。 在 Java 8 中&#xff0c;我们可以使用 flatMap…

前端工程师leetcode算法面试必备-二分搜索算法(下)

一、287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 1、HashMap 在没有其它附加条件的情况下&…

直属领导和老板都给了我绩效A,HR最后审核时降成了B,平时没有得罪她,她为什么这么做?...

绩效考核时&#xff0c;谁才是最终决定你绩效那个人&#xff1f;一位网友最近遇到了这样一件糟心事&#xff1a;季度绩效&#xff0c;直属领导和老板都给了A&#xff0c;人事最后审核时给降成了B&#xff0c;平时和人事没什么工作交集&#xff0c;按理说没有得罪她&#xff0c;…

Java工具——MySQL介绍与安装

Java工具——MySQL介绍与安装MySQL数据库介绍1. 简介2. MySQL发展历史MySQL数据库安装1. 下载安装包2. 安装3. 配置环境变量MySQL数据库介绍 1. 简介 MySQL是应用最广泛、普及度最高的开源关系型数据库&#xff0c;MySQL由瑞典MySQL AB公司开发&#xff0c;目前属于Oracle旗下…

Opencv 基本操作七 提取两幅图像的重叠区域

使用opencv提取连个图像的重叠区域&#xff0c;其本质就是提取两个图像的特征点&#xff0c;然后对两个图像的特征点进行匹配&#xff0c;根据匹配的特征点计算出透视变换矩阵H&#xff0c;然后根据H即可提取出两个图像的重叠区域。这里要注意的是&#xff0c;普通的opencv库没…

Kali Linux断网攻击

前言 ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生大量的ARP通信量使网络阻塞&#xff0c;攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目&#xff0c;造成网络中断或中间人攻击。 一句话解释&#xff1a; 断…

2022年总结 | 从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年&#xff0c;这一年对于我来说是十分重要的一年。在这一年里&#xff0c;我作为一名初二在校学生&#xff0c;在CSDN上发布…

2003-2021年高铁站开通时间

2003-2021年高铁站开通时间数据 1、时间&#xff1a;2003-2021年 2、指标&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 3、指标说明&#xff1a; 高速铁路&#xff0c;简称高铁&#xff0c;是指设计标准等级高、可供列车安全高速行驶…