在看一些代码的时候,会发现在定义long型和double型的变量时,会在前面加上volatile关键字,当然也会看到在其它原子类型的变量前加上这个关键字,但这里要说的还是有区别的。
在java中,java的内存模型要求,变量的读取操作和写入操作都必须是原子操作的,但是对于非volatile类型的long和double有些不同,因为这两个变量是64位存储,JVM允许将64位的读操作或写操作分解为2个32位的操作。这样,当在多线程环境中读取一个非volatile的long变量时,可能会出现读取到这个变量一个值的高32位和另一个值的低32位,从而导致数据出问题。
这里还需要说明下volatile关键字的作用,可以说有2个作用,其一是,用volatile修饰的变量的读取和写入都是直接操作内存,以保证被其它线程读取到值都是最新的,或者称之为确保内存的可见性;其二是,保证变量的读取和写入操作都是原子操作,就是上面long和double的读取所遇到的问题,注意这里提到的原子性只是针对变量的读取和写入,并不包括对变量的复杂操作,比如i++就无法使用volatile来确保这个操作是原子操作。
所以,在多线程环境中,要确保long和double变量的数据正确,可以使用volatile关键字修饰变量,也可以采用同步机制来保证数据的正确性。
另外《java并发编程实战》中也讲到了使用volatile的需要满足的所有条件:
a、对变量的写入操作不依赖于变量当前的值,或者你能确保只有单个线程更新变量的值
b、该变量不会与其他状态变量一起纳入不变性条件中
c、在访问变量时不需要加锁
参看《java并发编程实战》第三章
分享到:
相关推荐
总的来说,理解`long`和`double`在32位JVM中的非原子性是多线程编程中的一个重要知识点。在编写多线程代码时,应谨慎处理这类操作,尤其是当数据一致性至关重要的时候,可以借助synchronized关键字或原子类来确保...
在本文中,我们将深入探讨如何使用C#编程语言实现文件的加解密,特别是通过DES算法和多线程技术来优化处理效率,并结合进度条显示实时进度。首先,让我们了解DES(Data Encryption Standard)加密算法。 DES是一种...
本文将深入探讨如何在Java中实现多线程,并结合HTTP协议实现断点续传功能,以提高文件下载的效率和用户体验。 首先,我们需要理解什么是多线程。在单线程环境中,程序按照顺序执行任务,而多线程则允许同时执行多个...
多线程设计是Java编程中不可或缺的一部分,尤其在并发编程中起到至关重要的作用。以下是对多线程设计要点的详细讲解: 1. **内存模型**:JVM内存分为主内存和工作内存。主内存存储所有线程共享的数据,而工作内存则...
多线程 求质数 返回数组中的最大值 bool isPrime(long x) { if (x ) return false; if (x == 2) return true; for (long i = 2; i (sqrt((long double)x));i++) if (x%i == 0) return false; return true; } ...
### MPI教程:多线程编程入门 #### 一、引言 消息传递接口(Message Passing Interface,简称MPI)是一种广泛使用的并行计算标准,它允许程序员编写能够在分布式内存架构上运行的应用程序。本文档旨在为初学者提供...
本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在“雪花飘 多线程java”这个项目中,我们的目标是利用多线程来实现一个视觉效果:在窗口中有多朵雪花随机地...
在本主题中,我们将深入探讨`File`类结合字节流如何实现文件和目录的操作,特别是复制、删除、剪切(重命名)以及多线程环境下的文件下载。 首先,让我们来看看`File`类的一些核心方法: 1. `createNewFile()`:...
在Java编程语言中,多线程是并发执行的程序组件,可以提高系统资源的利用率,提升应用程序的响应速度。本节我们将深入探讨Java中的多线程基础,特别是数组的定义方式及其元素的默认值规则。 首先,让我们了解什么是...
多线程程序设计是软件开发中的一项重要技术,特别是在多处理器和分布式系统中。以下是对标题和描述中提及的多线程程序设计要点的详细解释: 1. **内存模型**:Java的内存模型中,存在主内存和工作内存的概念。主...
本文档旨在总结 Java 面试中常见的知识点,涵盖 volatile 变量、多线程环境、 Busy spin 等主题。 volatile 变量 volatile 变量是 Java 中的一种特殊变量,它提供顺序和可见性保证。volatile 变量的读写操作是原子...
3. **非原子性操作的同步**:虽然Java中的大部分基本类型操作是原子性的,但`long`和`double`类型的赋值操作在某些情况下不是原子性的,可能需要两个步骤完成。如果没有使用`volatile`,多线程环境下可能会出现不...
Java的多线程程序设计是开发高效并发应用的关键技术之一,以下是对标题和描述中所述的二十三个要点的详细解释: 1. **主内存与工作内存**:Java的内存模型JMM(Java Memory Model)定义了主内存(Main Memory)和...
根据提供的文件信息,我们可以归纳出以下...总结以上内容,我们可以了解到`volatile`关键字在Java多线程中的重要作用以及相关的CPU缓存管理和优化技术。这些知识点对于理解并发编程中的内存模型和性能调优至关重要。
- **基本数据类型**:包括整型(`byte`, `short`, `int`, `long`)、浮点型(`float`, `double`)、字符型(`char`)和布尔型(`boolean`)。 - **变量与常量**:了解如何声明、初始化以及使用这些变量和常量。 - **...
但volatile修饰的long和double变量的读写操作是原子的,这意味着在多线程环境下,它们的读取和写入会被保证为一次性完成,避免了数据不一致的问题。 3) volatile的一个实践场景是用于修饰long和double变量,以确保...
JAVA 面试题汇总(基础、容器...java 知识点总结:java 面试题汇总涵盖了 java 基础知识、容器知识和多线程知识,涵盖了 java 语言的基本概念、字符串操作、抽象类和接口等知识点,为 java 开发提供了系统的知识体系。
5. **wait()和notify()的使用**:在多线程编程中,wait()方法通常在synchronized代码块内并且包含在一个循环中使用。这是因为线程在调用wait()后会释放锁,而在等待条件满足之前,需要不断检查条件,防止过早唤醒或...