首页 > 其他分享 >volatile关键字的作用

volatile关键字的作用

时间:2024-06-09 18:33:29浏览次数:23  
标签:变量 synchronized 关键字 线程 volatile public 作用

在Java并发编程中,volatilesynchronized 是两种常见的同步机制。它们虽然都可以用于多线程环境下的变量同步,但在语义和使用场景上有显著区别。以下是详细的对比与补充:

volatile关键字

volatile 关键字用于声明共享变量,并为其赋予两层语义:

  1. 可见性保证

    • 当一个线程修改了 volatile 变量的值,新值会立即被刷新到主内存中,并且其他线程读取这个变量时可以立即获得最新的值。
    • 具体来说,当一个线程写入 volatile 变量时,会强制将缓存中的数据刷新到主内存;当一个线程读取 volatile 变量时,会强制从主内存中读取数据。
  2. 禁止指令重排序

    • volatile 变量在写操作和读操作时,会在指令层面加上内存屏障(Memory Barrier),以禁止对这些操作进行重排序,从而避免因重排序带来的数据不一致问题。

synchronized关键字

synchronized 关键字可以用于方法或者代码块,实现同步。其主要特点包括:

  1. 可见性和原子性保证

    • synchronized 不仅能保证变量的可见性,还能保证变量操作的原子性。
    • 进入 synchronized 方法或代码块的线程会持有锁,任何其他线程在锁被释放前都无法进入同一个 synchronized 方法或代码块。
  2. 线程阻塞

    • 使用 synchronized 关键字时,如果一个线程获取了锁,其他线程试图获取这把锁时会被阻塞,直到锁被释放。

对比总结

  1. 使用层级

    • volatile:只能用于变量级别。
    • synchronized:可以用于方法级别和代码块级别(包括类和实例级别)。
  2. 功能

    • volatile:只能保证可见性,不能保证操作的原子性。例如,volatile 不能保证复合操作(如i++)的原子性。
    • synchronized:不仅能保证可见性,还能保证操作的原子性。
  3. 性能

    • volatile:不会造成线程阻塞,性能开销较小,因为它不会涉及上下文切换和调度。
    • synchronized:可能会造成线程阻塞,导致上下文切换和调度,性能开销相对较大。
  4. 编译器优化

    • volatile:变量不会被编译器优化,必须每次都从主内存中读取。
    • synchronized:在锁释放之前,编译器和处理器都不能对其进行优化,但锁释放之后,相关代码仍可被优化。
      public class VolatileExample {
          private volatile boolean flag = false;
      
          public void writer() {
              flag = true;  // 写操作
          }
      
          public void reader() {
              if (flag) {  // 读操作
                  // 进行操作
              }
          }
      }
      public class SynchronizedExample {
          private int count = 0;
      
          public synchronized void increment() {
              count++;  // 原子性操作
          }
      
          public synchronized int getCount() {
              return count;  // 可见性保证
          }
      }

       

标签:变量,synchronized,关键字,线程,volatile,public,作用
From: https://www.cnblogs.com/Stars-125/p/18239851

相关文章

  • 提升实验室精密仪器性能的秘密:主动减震台的作用和优势
    导言:在现代科学实验室中,精密仪器的性能对研究的准确性和可靠性起着关键作用。为了确保实验设备的高效运行,科学家们不仅仅依赖于先进的技术,还采用了一些创新的解决方案。本文将介绍一种关键的实验室设备——主动减震台,探讨它的作用和优势,以及如何提升实验室仪器的性能。1.......
  • volatile的用法
    1.作用防止编译器优化对该变量的访问过程,确保每次访问都能得到最新的值。编译器通常会对代码进行优化,例如将变量的值存储在寄存器中,以减少对内存的访问2.应用场景:1.硬件寄存器2.中断服务程序中的变量3.多线程程序中的共享变量//stm32f407xx.htypedefstruct{__IOui......
  • Kotlin可空类型与非空类型以及`lateinit` 的作用
    Kotlin可空类型与非空类型以及lateinit的作用在Kotlin中,变量可以是可空类型或非空类型。可空类型表示变量可以包含一个空值(null),而非空类型表示变量不能包含空值。可空类型与非空类型非空类型:默认情况下,Kotlin中的变量是非空类型。例如,varrecyclerView:RecyclerView表......
  • 淘宝/天猫商品信息获取与搜索优化:详解API接口在商品详情获取与关键字搜索中的应用
    在数字化时代,电商平台的API接口成为了连接商家、开发者与消费者的重要桥梁。淘宝和天猫作为中国领先的电商平台,提供了丰富的API接口,使得商家和开发者能够更加便捷地获取商品信息和实现商品搜索功能。本文将详细介绍淘宝/天猫的商品详情API接口和按关键字搜索商品API接口,探讨如......
  • C++ -- noexcept关键字
    C++--noexcept关键字noexcept关键字作用:告诉编译器,函数中不会发生异常,有利于编译器对程序做出更多的优化,比如避免生成处理异常的额外代码,减少程序的大小例子声明了noexcept和没有声明的同一段代码:safeDivide当除数为0时,会直接调用std::terminate()来中止程序而不是throw......
  • 程序设计基础-C/C++关键字(程序员面试笔试宝典)
    简介生活中的点点滴滴离不开计算机程序,没有程序则没有现代化的生活。coding已不是理工科学生的专属了,任何学科的学生只要掌握一定的编程基础知识,通过系统联系,便可以掌握IT研发工作,成为一名优秀的程序员,本内容详细介绍C/C++当中的关键字。static(静态)变量有什么作用在C语言......
  • C语言学习日志4-关键字iii
    1.6,if、else组合1.6.1,bool变量与“零值”进行比较boolbTestFlag=FALSE;C),if(bTestFlag);if(!bTestFlag);1.6.2,float变量与“零值”进行比较floatfTestVal=0.0;B),if((fTestVal>=-EPSINON)&&(fTestVal<=EPSINON));//EPSINON为定义好的精度。1.6.3,指......
  • C语言学习日志2-关键字i
    1.1,最宽恒大量的关键字----autoauto:它很宽恒大量的,你就当它不存在吧。编译器在默认的缺省情况下,所有变量都是auto的。1.2,最快的关键字----registerregister:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝......
  • C语言学习日志3-关键字ii
    1.4,signed、unsigned关键字编译器缺省默认情况下数据为signed类型的。举例:上面的解释很容易理解,下面就考虑一下这个问题:include<stdio.h>include<string.h>intmain(){chara[1000];inti;for(i=0;i<1000;i++){a[i]=-1-i;//printf("a[%d]=0x%x\n",......
  • 【最新鸿蒙应用开发】——沙箱机制是什么?作用?场景?
    沙箱机制1.什么是沙箱机制?1.1.概念在操作系统当中,沙箱机制(Sandboxing)是一种安全机制,用于限制程序代码的访问权限,防止恶意软件对系统造成破坏。在沙箱环境中,程序只能访问特定的资源,如文件、注册表、网络等,而不能访问其他系统资源。这样,即使恶意软件试图执行有害操作,也会因......