valotile关键字

一、java的内存模型

       1、内存模型简介

      (1)不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的

         (2)线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。

          (3)我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的。JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节

     

        2、可见性

         前提:Java内存模型(JMM)规定了jvm有主内存主内存是多个线程共享的。当new一个对象的时候,也是被分配在主内存中,每个线程都有自己的工作内存,工作内存存储了主存的某些对象的副本。

           当线程操作某个对象时,执行顺序如下:

 (1) 从主存复制变量到当前工作内存 (read and load)
 (2) 执行代码,改变共享变量值 (use and assign)
 (3) 用工作内存数据刷新主存相关内容 (store and write)

 



    3、有序性

    如果线程工作内存中没有该变量,则直接从主存中拷贝过来一个副本,即read-load,同一线程对该字段又再次引用时候,有两种情况,一是从主存中取(即read-load-use),二是直接从副本中取(use)。

    对于一个多次引用该字段,并且进行asign,它会将值指定给工作内存中的变量副本(assign),完成后这个变量副本会同步到主存储区(store-write),至于何时同步过去,根据JVM实现系统决定。

 

二、synchronize和valotile

      (1)synchronize

             一个线程执行临界区代码过程如下:

           1 获得同步锁
           2 清空工作内存
           3 从主存拷贝变量副本到工作内存
           4 对这些变量计算
           5 将变量从工作内存写回到主存
           6 释放锁
           可见,synchronized既保证了多线程的并发有序性,又保证了多线程的内存可见性。

 

       (2)valotile

               是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。因此对于Valatile修饰的变量的修改,所有线程马上就能看到。

             

 

 

### C/C++中带有`volatile`关键字的结构体使用说明 在C/C++编程语言里,当定义一个结构体时,可以在其前加上`volatile`关键字以表明该结构体的数据成员可能会被外部因素改变。这意味着编译器不应该对该结构体内任何成员执行诸如缓存到寄存器之类的优化措施,而是每次都应从实际存储位置读取最新值[^1]。 对于结构体来说,标记为`volatile`意味着所有对其内部字段的操作都将被视为对易变数据的操作。下面给出一段简单的代码示例展示如何声明以及初始化这样的结构体: ```cpp // 定义带 volatile 的结构体 struct volatile StructExample { volatile int id; volatile char name[20]; }; int main(){ // 创建并初始化结构体实例 volatile StructExample se = { .id = 1, .name = "example"}; // 访问结构体中的元素 printf("ID is %d and Name is %s\n",se.id ,se.name); } ``` 需要注意的是,在某些特定场景下,比如嵌入式开发环境中与硬件交互或是编写多线程应用程序时,正确运用`volatile`修饰符非常重要。这是因为这些情况下存在多个独立实体(如其他进程、中断服务程序或DMA控制器)能够不经通知就更改内存中的数值[^4]。 此外,如果某个类的对象被声明成`volatile`类型的,则仅允许调用那些同样标注了`volatile`限定词的方法。这一特性也适用于含有复杂逻辑的自定义类型,例如包含方法和属性组合而成的大规模软件组件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值