并发编程的三大特性之原子性

news/2025/2/14 2:55:01/

原子性

这个定义是一种规定,描述了Java中的理想就是为了能实现一个操作不能分割,不可中断,一个线程在执行的时候,另一个线程不会去影响他。
Java中的原子性可以理解为多线程操作临界资源,预期的结果和最终的结果一致。

  • 原子性被破环的演示

在这里插入图片描述

如何保证并发编程中的原子性

  • 通过加锁的方式实现

在这里插入图片描述
在这里插入图片描述

CAS

CAS是compare and swap 是一条CPU级别的并发原语,CAS操作包括三个步骤:比较内存中的值、判断是否相等,如果相等则交换新值;如果不相等,则不做任何操作。这个操作是原子性的,即在执行过程中不会被其他线程中断。

  • 在Java中有使用基于Unsafe类提供关于CAS的操作方法。通过JVM帮助我们实现对CAS操作cpu的汇编指令。
  • CAS 需要注意的是他着重点 是比较和交换 ,值从哪里来需要我们自己获取
  • CAS的最主要应用就是实现乐观锁和锁自旋

CAS操作的时候只能使用对一个变量是原子性的,无法实现对多个

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

ABA问题:不符合原子操作

在这里插入图片描述

  • 解决方案:加入版本号
  • 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

CAS锁自旋时间过长:

CAS基本都需要自旋,又遇上高并发就会陷入忙等待的状态,进程虽然繁忙但是无法前进

在这里插入图片描述

Lock锁

  • Lock是一个接口,我们使用的是他的一些实现类
  • 并发较多的情况下推荐使用ReentrantLock锁
public class Test10 {private static int count;/*** ReentrantLock 是一个对象,使用的时候要把他new出来*/private static ReentrantLock lock = new ReentrantLock();public static void increment(){lock.lock();// 万一出错之后lock之后不会自动释放锁这一点和sy...不一样,需要在finally中释放锁资源try {count++;try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}} finally {lock.unlock();}}public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {for (int i = 0; i < 100; i++) {increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 100 ; i++) {increment();}});thread.start();thread2.start();thread.join();thread2.join();System.out.println(count);}
}

ReentrantLock可以直接对比synchronized,在功能上来说,都是锁。

但是ReentrantLock的功能性相比synchronized更丰富。

ReentrantLock底层是基于AQS实现的,有一个基于CAS维护的state变量来实现锁的操作。

在这里插入图片描述


http://www.ppmy.cn/news/92623.html

相关文章

C++_开发_Boost开源库_介绍_使用

文章目录 一、Boost库简介1、功能强大:2、构造精良:3、跨越平台:4、代码开源&#xff0c;完全免费:5、Boost库的大多数组件不需要编译链接。6、Boost的独特之处&#xff1a;7、分类1、字符串和文本处理库2、容器库3、迭代器库4、算法库5、函数对象和高阶编程库6、泛型编程库7、…

使用云服务器上线网站流程

刚好最近练手了一个开源项目&#xff0c;直接买了一年的服务器时长&#xff0c;上线一下项目&#xff0c;顺便记录流程。 校园云首单一年目前需要40元&#xff08;记得之前稍微便宜些&#xff09;。 一、购买云服务器 可以选择阿里云、腾讯云或其他等等。这里我购买的是腾讯云…

【Linux】死锁

文章目录 死锁关于阻塞的理解死锁的四个必要条件避免死锁的方法 死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 单执行流可能导致死锁问题吗? 可能&#xff01;例如:某一个执行流连续申请了…

Mock 测试技术详解及高级特性,你不得不会的技能!

Mock 是软件测试中常用的一种技术&#xff0c;它可以模拟外部依赖的行为和状态&#xff0c;以便进行更全面、准确和可靠的测试覆盖。Java 中的 Mock 框架是一个功能强大、易用的工具&#xff0c;可以帮助开发者快速、轻松地创建和配置 Mock 对象&#xff0c;并支持各种灵活的测…

nestjs笔记

控制反转 IoC 控制反转&#xff08;Inversion of Control&#xff0c;缩写为 IoC&#xff09;是面向对象编程中的一种设计原则&#xff0c;可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;…

最新的Oracle 数据库Sample Schema安装指南

今天根据之前博客如何使用github安装Oracle 数据库Sample Schema &#xff08;示例Schema&#xff09; &#xff0c;发现居然报错了。 从网站上看了下&#xff0c;发现确实有些变化&#xff0c;现描述如下。 第一个变化是OE和PM两个Schema进入归档状态&#xff0c;目前建议使用…

高校智能用电管理系统的应用探讨

摘 要&#xff1a;随着现代科学技术的发展&#xff0c;在高校中开始广泛应用智能化技术&#xff0c;改善学生宿舍的用电管理模式&#xff0c;提高宿舍的管理水平&#xff0c;有利于实现高校宿舍用电管理的科学化。本文主要阐述传统高校宿舍用电管理模式&#xff0c;设计高校智能…

编译原理实验-词法分析

具体代码已放至Github&#xff08;仅供参考&#xff09;&#xff1a; qxpBlog/Compiler_UESTC: 电子科技大学编译原理实验 (github.com) 具体实验过程如下&#xff1a; 一、实验内容及步骤&#xff1a; 1. 实验内容&#xff1a; 用flex生成一个词法分析器&#xff0c;用以识…