iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中Volatile关键字详解及代码示例
  • 250
分享到

Java中Volatile关键字详解及代码示例

javavolatile关键字ava 2023-05-30 22:05:22 250人浏览 安东尼
摘要

一、基本概念先补充一下概念:Java内存模型中的可见性、原子性和有序性。可见性:可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了

一、基本概念

先补充一下概念:Java内存模型中的可见性、原子性和有序性。

可见性:

可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。

可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如volatileinta=0;之后有一个操作a++;这个变量a具有可见性,但是a++依然是一个非原子操作,也就是这个操作同样存在线程安全问题。

在Java中volatile、synchronized和final实现可见性。

原子性:

原子是世界上的最小单位,具有不可分割性。比如a=0;(a非long和double类型)这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++;这个操作实际是a=a+1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。java的concurrent包下提供了一些原子类,我们可以通过阅读api来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

在Java中synchronized和在lock、unlock中操作保证原子性。

有序性:

Java语言提供了volatile和synchronized两个关键字来保证线程之间操作的有序性,volatile是因为其本身包含“禁止指令重排序”的语义,synchronized是由“一个变量在同一个时刻只允许一条线程对其进行lock操作”这条规则获得的,此规则决定了持有同一个对象的两个同步块只能串行执行。

下面内容摘录自《JavaConcurrencyinPractice》:

下面一段代码在多线程环境下,将存在问题。

+ View codepublic class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread {  @Override  public void run() {   while(!ready) {    Thread.yield();   }   System.out.println(number);  } } public static void main(String[] args) {  new ReaderThread().start();  number = 42;  ready = true; }}

--结束END--

本文标题: Java中Volatile关键字详解及代码示例

本文链接: https://www.lsjlt.com/news/221480.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中Volatile关键字详解及代码示例
    一、基本概念先补充一下概念:Java内存模型中的可见性、原子性和有序性。可见性:可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了...
    99+
    2023-05-30
    java volatile关键字 ava
  • java中volatile关键字的作用与实例代码
    一,什么是volatile关键字,作用是什么  volatile是java虚拟机提供的轻量级同步机制 ​ 作用是: 1.保证可见性 2.禁止指令重排 3.不保...
    99+
    2022-11-12
  • Java volatile关键字特性实例代码分析
    这篇文章主要讲解了“Java volatile关键字特性实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字特性实例代码分析”吧!一...
    99+
    2023-07-04
  • Java Synchronize下的volatile关键字详解
    简介关键词:Synchronize与volatile Synchronize:无论是对于Synchronize同步方法异或是Synchronize块,本质是对某对象或某类加锁,...
    99+
    2022-11-11
  • JAVA并发中VOLATILE关键字的示例分析
    小编给大家分享一下JAVA并发中VOLATILE关键字的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!并发编程中的三个概念:1.原子性在Java中,对基本...
    99+
    2023-06-15
  • 详解Java并发编程之volatile关键字
    目录1、volatile是什么?2、并发编程的三大特性3、什么是指令重排序?4、volatile有什么作用?5、volatile可以保证原子性?6、volatile 和 sy...
    99+
    2022-11-12
  • Java中的final关键字详解及实例
    Java中的final关键字1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。 上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 如果修...
    99+
    2023-05-31
    java final 关键字
  • c++中的volatile和variant关键字详解
    目录一、两个长得有点像的变量二、二者的功能三、应用实例四、总结一、两个长得有点像的变量 对volatile关键字,其实很多人只是能用,知道用到啥处,但其实应用的原理并不知道。在一些多...
    99+
    2022-11-13
  • Java Web关键字填空示例详解
    (1)在TestServletRequest中将名为“param”,值为“HelloWorld”的信息存入request范围内,并利用...
    99+
    2022-11-13
  • Java并发编程之关键字volatile的示例分析
    这篇文章给大家分享的是有关Java并发编程之关键字volatile的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、作用被 volatile 修饰的变量保证了不同线程对该变量操作的内存可见性禁止指令重排...
    99+
    2023-06-15
  • JAVA并发中VOLATILE关键字的神奇之处详解
    并发编程中的三个概念: 1.原子性 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。 2.可见性 对于可见性,Jav...
    99+
    2022-11-12
  • Java中不可或缺的关键字volatile详析
    目录什么是volatile关键字保证可见性保证有序性变量初始化赋值懒汉式单例 -- 双重校验锁 volatile版隐藏特性无法保证原子性volatile版synchronized版L...
    99+
    2022-12-27
    java关键字volatile作用 java关键字volatile原理 java关键字volatile
  • 多方面解读Java中的volatile关键字
    目录介绍作用保证变量的可见性:禁止指令重排:不能保证原子性可见性、有序性、原子性不会导致线程阻塞使用场景实现原理happens-before局限性和 synchronized 关键字...
    99+
    2023-05-19
    Java volatile volatile作用 volatile关键字
  • Java线程中的关键字和方法示例详解
    目录一、volatile关键字1,volatile 能保证内存可见性2,编译器优化问题二、wait 和 notify1,wait()方法2,notify()方法 3,not...
    99+
    2022-11-13
  • Java之dao模式详解及代码示例
    什么是dao模式?DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化...
    99+
    2023-05-30
    java dao设计模式 ava
  • Java中super关键字详解
    目录super有什么用?super什么时候不可以省略呢?super在内存图中是如何存在的呢?super使用时的注意事项总结super有什么用? (1)当子类中构造方法第一行没有sup...
    99+
    2022-11-13
  • Java注释和关键字实例详解
    目录Java注释单行注释多行注释文档注释Java关键字结束语Java注释 注释的含义:当我们写程序时需要对代码进行解释说明,这时我们就需要使用注释,以便于后期我们对之前敲过的代码还会...
    99+
    2023-01-15
    java注释规范 java中多行注释 java有效关键字
  • Android Service详解及示例代码
    Android Service 详细介绍: 1、Service的概念 2、Service的生命周期 3、实例:控制音乐播放的Service 一、Service的概念 ...
    99+
    2022-06-06
    android service service 示例 Android
  • Android SQLite详解及示例代码
    在Android中使用SQLite数据库的入门指南,打算分下面几部分与大家一起分享, 1、什么是SQLite 2、Android中使用SQLite 一、什么是SQLi...
    99+
    2022-06-06
    示例 SQLite Android
  • Android Menu详解及示例代码
    Android Menu 详细介绍: 1、选项菜单 OptionsMenu 2、上下文菜单 ContextMenu 3、子菜单 SubMenu 组成Android用户...
    99+
    2022-06-06
    示例 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作