首页 > 编程语言 >并发编程深入理解JMM&并发三大特性

并发编程深入理解JMM&并发三大特性

时间:2023-05-27 20:33:11浏览次数:44  
标签:java 变量 并发 线程 内存 JMM 有序性 三大

1 并发编程三大特性

  1. 可见性
  2. 原子性
  3. 有序性

2 JMM概念

 java虚拟机规范中定义了java内存模型,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现java程序在各种平台下都能达到一致的并发效果。

 

jmm规范规定了java虚拟机与计算机内存是如何协同工作的:

规定了一个线程如何及何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。

jmm描述的是一种抽象的概念,一种规则,通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式。

jmm时围绕原子性,可见性,有序性展开的。

3  三大特性描述

   3.1 可见性

        描述:当一个线程修改了共享变量的值,其他线程能够看到修改的值。

        如何保证可见性:

      •  volatile
      • 内存屏障
      • synchronized
      • lock
      • final

        java内存模型是通过,在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值,这种依赖主内存作为传递媒介的方法来保证可见性。

   3.2 有序性

        描述:按照代码的先后顺序执行,jvm存在指令重排,所有存在有序性问题。

        如何保证有序性:

      •  volatile
      • 内存屏障
      • synchronized
      • lock 

   3.3 原子性

        描述: 略

       如何保证原子性

      •         synchronized
      • lock
      • cas

4 上图

5 内存交互操作

 

 lock:  作用于主内存的变量,把一个变量标识为线程独占状态

read: 作用于主内存的变量,把主内存的变量运输到工作内存中,以便load操作

load:作用于工作内存的变量,把read的值放入到工作内存的副本中

use: 将工作内存中的变量传递给执行引擎

其他略

 

标签:java,变量,并发,线程,内存,JMM,有序性,三大
From: https://www.cnblogs.com/yumx/p/17437294.html

相关文章

  • 阅读《java并发编程实战》第三章
    阅读《java并发编程实战》第三章第一个例子,没有重现publicclassNoVisibility{privatestaticbooleanready;privatestaticintnumber;privatestaticclassReaderThreadextendsThread{publicvoidrun(){while(!ready){......
  • 物联网的三大特性
    一般认为,物联网具有以下的三大特征:1.全面感知:利用RFID、传感器、二维码等随时随地获取物体的信息。2.可靠传递:通过无线网络与互联网的融合,将物体的信息实时准确地传递给用户。3.智能处理:利用云计算、数据挖掘以及模糊识别等人工智能技术,对海量的数据和信息进行分析和处理,对物体实......
  • 【㉿Java并发】对象有状态 & 无状态
    有状态就是有数据存储功能。有状态对象(StatefulBean),就是有变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。实例变量和类变量都是状态变量无状态就是一次操作,不能保存数据。无状态对象(StatelessBean),就是没有实例 变量的对象.不能保存数据,是不......
  • 使用fx.Parallel方法并发执行函数时遇到的惰性计算的坑
    错误的写法packagescripts_stroageimport("encoding/hex""fmt""github.com/zeromicro/go-zero/core/fx""math/rand""sync""testing""time")varfns[]func()......
  • Go 语言 map 是并发安全的吗?
    原文链接:Go语言map是并发安全的吗?Go语言中的map是一个非常常用的数据结构,它允许我们快速地存储和检索键值对。然而,在并发场景下使用map时,还是有一些问题需要注意的。本文将探讨Go语言中的map是否是并发安全的,并提供三种方案来解决并发问题。先来回答一下题目的问......
  • 使用这些方法让你的 Python 并发任务执行得更好
    动动发财的小手,点个赞吧!问题一直以来,Python的多线程性能因为GIL而一直没有达到预期。所以从3.4版本开始,Python引入了asyncio包,通过并发的方式并发执行IO-bound任务。经过多次迭代,asyncioAPI的效果非常好,并发任务的性能相比多线程版本有了很大的提升。但是,程序员在使......
  • 五、JUC-Java内存模型JMM
    一、一些疑问什么是Java内存模型JMMJMM与volatile他们两个之间的关系JMM有哪些特性为什么要有JMM,他们为什么出现,功能和作用是什么happens-before先行发生原则是什么二、计算机硬件存储体系计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存到CPU一般对应的程序......
  • 如何调整Gitlab-Runner最大并发数?
    概述:我们在使用gitlab-runner做cicd时,如果安装之后没有配置gitlab-runner的最大并发数,在使用时候可能会碰到job的警告(job日志超过字节限制):job‘slogexceededlimitof4194304bytes*****查看默认最大并发数concurrent=10cat/etc/gitlab-runner/config.toml解决办法......
  • Java并发--sleep()、wait()、notify()、notifyAll()方法详解
    sleep()和wait方法比较 基本差别:1,sleep是Thread类中的native方法、wait是Object类中的方法。/***Causesthecurrentlyexecutingthreadtosleep(temporarilycease*execution)forthespecifiednumberofmilliseconds,subjectto*theprecisionandaccuracy......
  • 转:Sql Server 高并发的情况下,如何利用锁保证数据的稳定性
    前言SQL的锁机制,是时刻贯彻在每一次的sql事务中的,为了理解更透彻,介绍锁之前,我们得先了解,锁是为了干什么!!一、数据库异常情况1.1、先来聊聊数据可能发生个异常状况脏读:读未提交,顾名思义,读到了不该读的东西,如:事务B读到了事务A回滚的数据,就是脏读不可重复读:读已提交,同个事务内......