首页 > 系统相关 >内存可见性问题及synchronized的作用

内存可见性问题及synchronized的作用

时间:2024-11-11 11:43:38浏览次数:3  
标签:缓存 变量 synchronized 可见 线程 内存 JMM

内存可见性问题

在多线程编程中,内存可见性是一个关键问题。内存可见性问题指的是当多个线程访问同一个变量时,一个线程对变量的修改对其他线程不可见。这通常是由于缓存和线程内部的局部变量导致的。

synchronized与内存可见性

synchronized关键字在Java中不仅保证了临界区内最多同时只有一个线程执行操作,而且还保证了在前一个线程释放锁之后,所做的所有修改都能被获得同一个锁的下一个线程所看到,也就是能读取到最新的值。如果其他线程看不到之前的修改,依然也会发生线程安全问题。

CPU多级缓存导致的数据过期

线程间对于共享变量的可见性问题,并不是直接由多核引起的,而是由L3缓存、L2缓存、L1缓存,也就是多级缓存引起的。每个核心在读取数据时,都会将数据从内存一层层往上读取,同样,后续对于数据的修改也是先写入到自己的L1缓存中,然后等待时机再逐层往下同步,直到最终刷回内存。

JMM的抽象:主内存和工作内存

主内存和工作内存

Java内存模型(JMM)是一个抽象的概念,它描述了程序中变量的访问规则。在JMM中,每个线程只能够直接接触到工作内存,无法直接操作主内存,而工作内存中所保存的正是主内存的共享变量的副本,主内存和工作内存之间的通信是由JMM控制的。

主内存和工作内存的关系

JMM规定了以下几点:

  • 所有的变量都存储在主内存中,同时每个线程拥有自己独立的工作内存,而工作内存中的变量的内容是主内存中该变量的拷贝。
  • 线程不能直接读/写主内存中的变量,但可以操作自己工作内存中的变量,然后再同步到主内存中,这样其他线程就可以看到本次修改。
  • 主内存是由多个线程所共享的,但线程间不共享各自的工作内存,如果线程间需要通信,则需要借助主内存中转来完成。

结论

理解内存可见性问题和synchronized的作用对于编写正确的并发程序至关重要。通过使用synchronized,我们可以确保在多线程环境中共享变量的一致性和可见性,从而避免复杂的线程安全问题。同时,了解CPU多级缓存和JMM的工作原理,可以帮助我们更好地理解内存可见性问题,并采取适当的措施来解决这些问题。

标签:缓存,变量,synchronized,可见,线程,内存,JMM
From: https://blog.csdn.net/fulai00/article/details/143677434

相关文章

  • 千兆反射内存卡的技术原理与优势
    在当今数字化的快节奏世界中,数据的快速、准确和实时传输已成为各行各业成功的关键。反射内存卡,作为一种尖端的数据传输解决方案,以其独特的性能和广泛的应用前景,正在引领行业的变革。本文将深入探讨千兆反射内存卡的应用领域及其发展前景,揭示这一技术如何为各行各业带来前所未有......
  • .NET 中的虚拟内存
    在.Net中,虚拟内存是由操作系统管理的地址空间,允许应用程序在可用物理内存(RAM)之上分配和使用更多的内存。C#程序(或.NET程序)运行在.NET公共语言运行时(CLR)上,CLR会利用虚拟内存来分配和管理对象,但具体的虚拟内存分配与管理则由操作系统来处理。C#和.NET中的虚拟内存概念......
  • C++中的RAII与内存管理
    C++中的RAII与内存管理引言资源获取即初始化(ResourceAcquisitionIsInitialization,简称RAII)是C++编程中一种重要的编程范式,它通过对象生命周期来管理资源,确保资源在不再需要时能够被正确释放。本文将从C++的内存布局入手,逐步深入到栈区、堆区的概念,new和delete的操作原理,最终......
  • C++17 多态内存管理 pmr
    C++17多态内存管理pmr概念C++17开始,增加特性PolymorphicMemoryResources多态内存资源,缩写PMR。提供新的内存分配策略,更灵活地控制内存的分配与回收——适用于嵌入式和高并发服务器场景。对内存资源的抽象抽象基类std::pmr::memory_resource定义了用于内存的分......
  • STM32的内存(堆和栈)
    一般来说单片机的内存指的是FLASH和RAM,当在程序中定义了全局变量、局部变量、只读变量等参数时都是会存放到对应的FLASH或者是RAM中。具体对单片机FLASH和RAM的介绍之后再写,这里只对单片机内存分配,对堆和栈以及变量的存储做一个梳理和记录。1、FLASH(0x08000000)FLASH主要是存放......
  • 动态内存2
    今天我们来介绍一下剩下的两个函数,calloc函数和realloc函数,现在我们就来学习。1.calloc函数这个函数跟malloc函数的用法大致相同,唯一区别就是calloc函数在申请空间后会帮你把每个字节初始化为0。 2.realloc函数这个函数让动态内存管理更加灵活。这个函数可以实现内存大小......
  • 动态内存(c)
    大家好,今天我们就来聊聊c语言中动态内存的一些知识,相信大家很多时候在申请空间时总会有空间不够用或者太大用不完的情况吧,这个时候使用动态内存就是一个不错的选择,下面我们便来了解一下。1.malloc函数这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针,注意并不......
  • 程序的内存模型
    内存分区模型C++程序在执行时,将内存大致分为4个区域。1.代码区:存放函数体的二进制代码,由操作系统进行管理。2.全局区:存放全局变量和静态变量以及常量。3.栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统......
  • 内存管理-41-highatomic预留内存
    基于msm-5.4一、相关结构体1.structzonestructzone{unsignedlongnr_reserved_highatomic;...};成员介绍:nr_reserved_highatomic:记录为高优先级原子分配预留的内存页面数量。二、赋值逻辑赋值路径只有两个,一个是对高阶原子分配进行页面预留,另一个是减......
  • 内存映射I/O(MMIO)是一种将硬件设备的控制寄存器和数据寄存器映射到处理器的地址空间中
    内存映射I/O(Memory-MappedI/O,简称MMIO)内存映射I/O(MMIO)是一种将硬件设备的控制寄存器和数据寄存器映射到处理器的地址空间中的技术。在这种方式下,操作系统和程序可以像访问内存一样,通过常规的内存访问指令(如读写)来访问硬件设备,而不需要使用专门的输入/输出指令。它简化了硬件访问......