并发编程初解

news/2025/3/19 13:44:14/

1.概述

        java是最先支持多线程开发的语言之一,多线程技术使得程序的响应更快,可以再进行其他工作的同时一直处于活动状态。

        性能提升的本质就是榨取硬件的剩余价值即就是提高硬件的利用率。

        并发编程所带来的问题:

        安全性问题(访问共享变量)

        性能问题(线程切换所导致的CPU开销)

2.并行与并发

        并行:同一时间节点,多个任务同时进行

        并发:同一时间结点,多个任务依次交替执行。

        对于并发而言,操作系统存在一个任务调度片,线程切换即就是时间片太过短暂,线程切换的速度非常快,因此在微观上看并发是串行的,宏观上来看就是并行的。

        举个例子来说:

        并行:两个人在两台饮水机在同时执行接水操作

        并发:两个人在一台饮水机依次交替接水

3.并发编程的核心问题

核心问题即就是缓存所带来的可见性问题,编译优化所带来的有序性问题以及线程切换所带的原子性问题。

3.1可见性

一个线程对共享变量的修改,另外一个线程立马可以看到,称之为可见性。

在多线程的时代,每个CPU都有自己本地缓存,缓存又只对处理器的内核可见,导致了缓存的内容与内存的内容可能会不一致。处理器采用写缓冲区来保存写入内存的数据,而写缓冲区采用批处理的方式刷新内存,也就是说缓存中的数据并不会立即刷新到内存中,这也就导致了可见性问题。

3.2有序性

程序按照代码的先后顺序之星称之为有序性。

在程序执行的过程中,编译期经常会为了优化程序性能,从而乱序执行,也就导致了有序性问题。CPU的读等待同时指令执行是CPU执行乱序的根源。............................0

3.3原子性

一个线程或多个线程在执行的过程中不被中断的特性称之为原子性。

线程切换导致了原子性问题,具有原子性的量,同一时刻只能有一个线程执行操作。

4.volatile关键字

        volatile修饰一个共享变量时,可以保证可见性与有序性,无法保证其原子性

底层实现原理:

        使用内存屏障,内存屏障可以限制处理器以及编译器做出的指令重排

        volatile所修饰的共享变量编译为汇编语言之后会多出一个lock前缀,通过lock指令前缀+MESI缓存一致性协议可以保证操作的可见性。

        有序性实现:主要通过对valitale修饰的变量在进行读写操作前后加入内存屏障来限制指令的重排。

        可见性实现:主要通过lock前缀指令+MESI缓存一致性协议实现;对volitale修饰的量进行写操作时,JVM会给CPU发送一个lock指令前缀,CPU在执行完写操作时,会立即将数据刷新到内存中,因为MESI缓存一致性协议,其它线程会对主线进行嗅探即就是与内存值作对比,查看自己的本地缓存是否被修改过,一旦被修改就会过期掉本地缓存,从主线中刷新到最新的内存值,这样就保证了可见性。

5。如何保证原子性?

5.1synchronized关键字

        synchronized是一种通用的技术方案,JAVA语言提供的synchronized关键字,就是锁的一种实现,synchronized是一种独占锁、排它锁;并不能改变CPU时间片的切换,但是synchronized锁可以产生阻塞,当一个线程对共享变量进行修改时,其它的线程必须在外面排队等候,因次同一时刻只能有一个线程进行操作。因此synchronized一定可以保证原子性。

5.2原子变量类

        javaJUC包中存在两个包,一个是locks包,另一个是atomic包;两者都可以解决原子性问题。

       synchronized是一种阻塞式实现原子性

        原子变量则是非阻塞式实现原子性

        原子变量类的原理:通过volatile关键字+CAS算法实现原子性

5.3CAS算法

        CAS(compare and swap)比较并交换,CAS算法是硬件对并发操作的一种支持,是乐观锁的一种实现方式,采用自旋锁的思想,是一种轻量级锁

        CAS算法的实现原理:每次判断内存值是否与预估值相同,如果不相同,则证明内存值已经被其他线程修改过了。则需要拿到最新值作为新的预估值,然后再次与内存值作比较;该线程就会不断的判断内存值是否被修改过,这就是自旋的思想。

        CAS算法共有三个操作数

        预估值:A 

        内存值:V

        更新值:B

当且仅当预估值与内存值相同时,将内存值赋给更新值

        CAS算法的优点:当判断不成功时,不会更新值,也不会产生阻塞,继续判断执行,提高了效率。

        CAS算法的缺点:不断地自旋,会导致CPU的消耗,高并发的情况下可能会导致CPU跑满。

        CAS算法所带来的问题:ABA问题:即就是当一个线程将内存值由A修改为B,另外一个线程将B又修改为了A;预估值与内存值相比较还是相同;CAS算法就无法判断内存值是否被修改过。

        解决方案:使用类版本添加号,每次对内存的修改都添加上类版本添加号,判断时先判断内存值是否相同,再判断类版本添加号是否相同,这样就可以避免ABA问题。


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

相关文章

原生JS实现腾讯视频轮播图

给大家分享一个用原生JS实现的腾讯视频轮播图特效,实现效果如下: 以下是代码实现,欢迎大家复制粘贴。 <!DOCTYPE html> <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>原生…

Elasticsearch使用就是如此的简单

前言 项目地址&#xff1a;https://gitee.com/charlinchenlin/wysmall Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性&#xff0c;能使数据在生产环境变得更有价值…

Day05—JDBC操作事务与数据库连接池

一&#xff1a;JDBC操作事务 1.1&#xff1a;事务异常回滚 事务控制 连接.setAutoCommit(false); 开启事务 连接.rollback(); 连接.commit(); connection.setAutoCommit(false); connection.setAutoCommit(true); Testpublic void test01() throws SQLException, IOException,…

Spark Core

Spark Core 1.1 第一天介绍发展、特性。 1.2 安装了standalone模式&#xff1a;伪分布式 1.3 部署模式——local、standalone、yarn模式。 mesos、云… 1.4 编码&#xff1a;java、lambda、scala 1.5 底层执行流程 Scala 2.1 集合 Array &#xff1a; 长度可变。长度不可变 Se…

day20(php和mysql)

typora-copy-images-to: img typora-root-url: img 服务器[了解] 前言&#xff1a;通俗的讲&#xff0c;能够提供某种服务的机器&#xff08;计算机&#xff09;称为服务器 服务器软件 使计算机具备提供某种服务能力的应用软件&#xff0c;称为服务器软件&#xff0c; 通过安装…

HTML5期末大作业【红色的电影售票平台网站】web前端 html+css+javascript网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录 一、网页介绍一…

利用存放在数组里的对象来渲染生成表格

完整效果 首先渲染把头部和尾部渲染到页面中 渲染头部document.write(<table> <caption>学生详细信息</caption><tr><th>序号</th><th>姓名</th><th>年龄</th><th>性别</th><th>地址</th>…

基于HTML+CSS+JavaScript仿淘宝购物商城设计毕业论文源码

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…