Java并发编程—java内存模型2

news2024/11/15 11:20:28

文章目录

  • 重排序
      • 数据依赖性
      • as-if-serial
      • 重排序对多线程的影响
  • 顺序一致性
      • 同步程序的顺序一致性效果
      • 同步/异步
      • 总线事务
  • 双重校验锁

——————————————————————————————————

重排序

数据依赖性

数据依赖不能进行重排序
在这里插入图片描述

as-if-serial

  • as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。
  • 【as-if-serial不允许指令重排序是要让结果不变,不是严格意义上的不允许重排序】

重排序对多线程的影响

class ReorderExample { 
    int a = 0; 
    boolean flag = false; 
    public void writer() { 
        a = 1; // 1 
        flag = true; // 2 
    }
    Public void reader() { 
        if (f?lag) { // 3 
        int i = a * a; // 4 
        …… 
        } 
    } 
}
可能出现,2->3->4->1这样的执行顺序,导致结果i=0;

顺序一致性

  • 不让重排序
  • 顺序一致性指多线程下排队执行,只会出现写后读的情况。(看到的和执行的一样)
  • 顺序一致性内存模型有两大特性:
    • 1)一个线程中的所有操作必须按照程序的顺序来执行。
    • 2)(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。

同步程序的顺序一致性效果

通过加锁实现顺序一致性,加锁后里面重排序也没有问题,因为上锁之后,切换线程后t1没有释放锁,t2无法拷贝,时间片过了之后就会切换成t1执行,t1整个方法执行完之后才会释放锁,肯定能保证t1的结果正确。

同步/异步

  • 同步:排队;共享资源,一个一个操作资源
  • 异步:不排队;一个线程没操作完,其他线程也可以使用该资源

总线事务

总线事务包括读事务和写事务(事务:一系列的操作要么都成功,要么都失败-ACID)

  • 读事务从内存传送数据到处理器
  • 写事务从处理器传送数据到内存
  • 每个事务会读/写内存中一个或多个物理上连续的字
  • 关键: 总线会同步试图并发使用总线的事务

在一个处理器执行总线事务期间,总线会禁止其他的处理器和I/O设备执行内存的读/写

  • 总线中电压会互相干扰,所以前面必须实现拦截(物理限制,导线传输电压互相有影响)
  • 如果以后变成光纤传输就不会有电压影响了,光信号支持双向传输也支持同时传输信号(例:人眼一次性能看到很多物体,不同物体光波不一样)

当单个内存操作不具有原子性时,可能会产生意想不到后果:

  • 因为=》总线传输一个指令时,不止传输一次,会传输很多次(总线宽度是36-41位,意味着单次传输只能传输41bit数据)
  • 指令的数据传输都是基本类型数据,必须是8的倍数。(就像传long类型的数据需要分两次传输,因此传输数据都是一批次一批次的,不是单独传的,否则数据会混乱)

双重校验锁

双重检查锁定:人们想通过双重检查锁定来降低同步的开销。下面是使用双重检查锁定来实现延迟初始化的示例代码。
在这里插入图片描述
构造方法还是有问题的,还有重排序问题
现在不锁方法了,证明方法可以被很多线程拷贝

  • 双检锁/双重校验锁(DCL,即double-checked locking)
  • JDK 版本:JDK1.5起
  • 是否Lazy初始化:是
  • 是否多线程安全:是
  • 实现难度:较复杂
  • 描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
  • getInstance()的性能对应用程序很关键。
    【实例】
public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
        }  
    }  
    return singleton;  
    }  
}

在这里插入图片描述

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

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

相关文章

[附源码]计算机毕业设计大学生心理健康测评系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Compressed Bloom Filters论文总结

Compressed Bloom Filters论文总结AbstractI. INTRODUCTIONII. COMPRESSED BLOOM FILTERS:THEORYA. Bloom FiltersB. Compressed Bloom FiltersIII. COMPRESSED BLOOM FILTERS:PRACTICEA. ExamplesIV. DELTA COMPRESSIONV. COUNTING BLOOM FILTERSVI. CONCLUSIONAbstract 我们…

Elasticsearch面试题

Elasticsearch面试题 1 为什么要使用Elasticsearch? 系统中的数据,随着业务的发展,时间的推移,将会非常多,而业务中往往采用模糊查询进行数据的搜索,而模糊查询会导致查询引擎放弃索引,导致系统查询数据…

C#/WPF/.NET 找到的程序集清单定义与程序集引用不匹配

vs 窗口报错 引发的异常:“System.Windows.Markup.XamlParseException”(位于 PresentationFramework.dll 中) “初始化“CircularGauge.CircularGaugeControl”时引发了异常。”,行号为“288”,行位置为“23”。代码位置报错 FileLoadException: 未能…

【Qt记录】属性 Q_PROPERTY

使用: Qt 拥有一个属性系统。我经常在QSS中使用 QWidget#SWNotifyMsgDialog QLabel#label_sure[status"normal"]配合在代码中使用 ui.label_sure->setProperty("status","warning"); 函数原型:bool QObject:setProp…

物联网开发笔记(56)- 使用Micropython开发ESP32开发板之手机蓝牙控制舵机

一、目的 这一节我们学习如何使用我们的ESP32开发板来实现通过蓝牙控制接在ESP32开发板上的舵机。 二、环境 ESP32 MG90S舵机 Thonny IDE 几根杜邦线 手机 舵机的链接方法见第54节:物联网开发笔记(54)- 使用Micropython开发ESP32开发板之…

Win11的两个实用技巧系列之电脑死机解决办法

目录 Win11电脑突然死机卡住不动?Win11电脑死机屏幕静止 方法一: 方法二: sfc包括有以下命令: 方法三: 点击拿去 Win11电脑突然死机卡住不动?Win11电脑死机屏幕静止 在使用Win11系统时,很多用户经常会遇到自己…

12月3日下午:thinkphp框架中的视图以及模型剩余部分

回忆知识: dump()与halt()方法 dump():输出内容后不会终止脚本,会继续向下执行 halt():输出内容后会终止脚本,结束程序 //dump()和halt()public function haltTest(){$result \db(demo)->where(id,,1)->select…

【Qt记录】Windows 窗口层级(Z-order)

功能:软件有一个提示弹窗,希望让他永远在最上面,保证该窗口在任何情况下不会被遮挡。 由上面的问题就查找对应的api找到了SetWindowPos()。 在说这个函数之前,先了解以下概念: Z-order(Z顺序&#xff09…

6. SpringBoot 整合 RabbitMQ

二八佳人体似酥&#xff0c;腰间仗剑斩愚夫。虽然不见人头落&#xff0c;暗里教君骨髓枯。 创建一个 普通的 Spring Boot Web 项目 整合 RabbitMQ pom.xml 添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st…

【云原生】一文带你吃透FlexManager数据传入华为云IOT

文章目录一、华为云设备接入服务1、创建设备接入基础版2、创建产品实例3、在产品下创建设备实例二、FlexManager部署一、华为云设备接入服务 设备接入服务&#xff08;IoTDA&#xff09;是华为云的物联网平台&#xff0c;提供海量设备连接上云、设备和云端双向消息通信、批量设…

【Linux】守护进程

文章目录任务管理进程组作业会话任务管理操作相关操作守护进程创建守护进程daemon函数创建守护进程所谓的项目部署任务管理 进程组 进程组是一个或多个进程的集合。每个进程除了有一个进程ID之外&#xff0c;还属于一个进程组。 每个进程组有一个唯一的进程组ID。每个进程组都…

CTFShow re2 (RC4

参考&#xff1a;CTFSHOW re2 本文&#xff1a;跟着大佬的博客一步一步做CTFShow re2的记录 IDA分析 有个比较函数 re一下 s "DH~mqqvqxB^||zllJq~jkwpmvez{" s1 for i in s:s1 chr(ord(i) ^ 0x1f) print(s1)得到 再四处看看 跟进sub_401028 四个sub点进去看看…

禅道登录-调用API方式

禅道提供了API机制方便于大家和其他的系统进行集成&#xff0c;API机制也都是基于http协议的&#xff0c;返回的数据以json格式存储。禅道的API都是需要先登录后才能进行接口调用&#xff08;登录返回的cookie需要在之后的每次请求中携带用于验证身份信息&#xff09;。网上关于…

DNS中有哪些值得学习的优秀设计

为什么要有DNS 如果我们想要访问某度&#xff0c;你可以在浏览器上的搜索栏里输入112.80.248.76这个IP地址&#xff0c;直达页面。 通过IP访问网页 这样的行为&#xff0c;合法&#xff0c;但有病。 大部分人&#xff0c;连自己对象的电话号码都记不住&#xff0c;又怎么可能…

shell脚本受限执行

shell 中运行的脚本或脚本的个代码断会禁用一些正常 shell 中可以执行的命令.这是限制脚本用户的权限和最小化运行脚本导致的破坏的安全措施.受限的内容包括&#xff1a;使用 cd 命令更改工作目录. 更改环境变量$PATH, $SHELL, $BASH_ENV,或$ENV 的值. 读或更改 shell 环境选项…

ARM 反汇编工具objdump的使用简介

一、反汇编的原理 & 为什么要反汇编 arm-linux-objdump -D led.elf > led_elf.dis-D, --disassemble-all Display assembler contents of all sectionsobjdump 是 gcc 工具链中的反汇编工具&#xff0c;作用是由编译链接好的 elf 格式的可执行程序反过来得到汇编源代…

【期末大作业】基于HTML+CSS+JavaScript网上订餐系统(23个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

26-38-javajvm-类加载器子系统

26-javajvm-类加载器子系统&#xff1a; 1.内存结构概述 2.类加载子系统 2.1 类加载器子系统的作用 1&#xff09;、类加载器子系统负责从文件系统或者网络中加载Class文件&#xff0c;class文件在文件开头有特定的文件标识。 2&#xff09;、ClassLoader只负责class文件的加…

常用的shell命令

常用的shell命令 1、ls命令 功能&#xff1a;显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性&#xff0c;包括大小&#xff0c;日期&#xff0c;符号连接&#xff0c;是否可读写及是否可执行 ls -lh 显示文件的…