`

为什么Java中的long与double不是线程安全的?

 
阅读更多

 Long与double操作并不是原子的


java的部分执行 环境中,对于long以及double的操作并不是原子的。

        例如有一个long类型的longfield字段,某个线程正在执行:

        longfield = 123L ;

        这样的指定操作,而同时有另一个线程正在执行:

        longfield = 456L;

        这样的指定操作。之后longfield的值会是什么,是无法保证的。也许是123L,也可能是456L,或许是0L,甚至还可能是31415926L。

        所以我们可以的出下列结论:

        1.基本类型,引用类型的指定,引用是原子的操作;

        2.但是long与double的指定,引用是分割的;

        3.要在线程间共享long与double字段是,必须在synchronized中操作,或是声明为volatile。

 

以前只知道Java中的long与double不是线程安全的,但不知道为什么,读《深入java虚拟机》一书,了解了大概。
  Java虚拟机规范定义的许多规则中的一条:所有对基本类型的操作,除了某些对long类型和double类型的操作之外,都必须是原子级的。 
    由于规范没有规定如何实现,那么当今所知的虚拟机对这条规则的实现都是把32位值做为原子性对待,而不是64位做为原子性。那么,当线程把主存中的 long/double类型的值读到线程内存中时,可能是两次32位值的写操作,显而易见,如果几个线程同时操作,那么就可能会出现高低2个32位值出错 的情况发生,所以现在,java程序必须确保通过同步来操作共享的long和double。

 

参考: 1 《深入java虚拟机》

          2  Long与double操作并不是原子的 http://blog.csdn.net/xingqisan/archive/2009/02/25/3935169.aspx

          3  为什么Java中的long与double不是线程安全的? http://magnetocn.bokee.com/viewdiary.10946639.html

分享到:
评论

相关推荐

    Java多线程与线程安全实践-基于Http协议的断点续传

    在Java编程领域,多线程和线程安全是至关重要的概念,特别是在开发高效、响应迅速的应用程序时。本文将深入探讨如何在Java中实现多线程,并结合HTTP协议实现断点续传功能,以提高文件下载的效率和用户体验。 首先,...

    long和double类型操作的非原子性探究(csdn)————程序.pdf

    总的来说,理解`long`和`double`在32位JVM中的非原子性是多线程编程中的一个重要知识点。在编写多线程代码时,应谨慎处理这类操作,尤其是当数据一致性至关重要的时候,可以借助synchronized关键字或原子类来确保...

    JAVA线程深入了解

    - 基本数据类型如`char`、`int`的赋值和引用操作是原子的,但在Java语言规范中,`long`和`double`类型的赋值和引用操作并非总是原子的。 - 对象引用类型的赋值和引用操作也是原子的。 以上是对Java线程深入理解的...

    100家大公司java笔试题汇总

    6. 在Java中,什么是线程? 答:线程是程序执行的单元,可以独立执行,提高程序的执行效率。 Java网络编程 7. Java中,什么是Servlet? 答:Servlet是Java中的Web组件,用于处理HTTP请求。 8. 在Java中,什么是...

    java面试题.docx

    答:Java 中有八种基本数据类型:byte、short、int、long、float、double、char、boolean。 2. Java 中的访问修饰符有哪些? 答:Java 中的访问修饰符有四种:public、private、protected、default。 3. Java 中的...

    JavaGuide.pdf

    答:Java 的基本数据类型包括 byte、short、int、long、float、double、char、boolean 等。 2. Java 中的引用类型有哪些? 答:Java 中的引用类型包括类、接口、数组、枚举、注解等。 3. Java 中的基本数据类型和...

    Java多线程基础-03、数组定义方式二、元素默认值规则.rar

    在Java编程语言中,多线程是并发执行的程序组件,可以提高系统资源的利用率,提升应用程序的响应速度。本节我们将深入探讨Java中的多线程基础,特别是数组的定义方式及其元素的默认值规则。 首先,让我们了解什么是...

    JSR133中文版.pdf

    此外,文档讨论了如字分裂(Word Tearing)、double和long的非原子性处理等低级内存操作问题,以及线程间的公平性和wait集与通知机制。这些内容有助于深入理解Java内存模型和线程的高级特性和潜在陷阱。 文档结束...

    Java线程与缓存面试题,面试必看,附代码.docx

    Java线程与缓存是Java开发中至关重要的概念,尤其对于有一定经验的开发者来说,面试时往往会遇到相关问题。以下是对这些知识点的详细说明: 1. **基础信息** - **数据类型**:Java提供了八种原始数据类型,包括...

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    在Java编程中,多线程同步是一个核心概念,用于确保多个线程访问共享资源时的正确性。本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **...

    雪花飘 多线程java

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在“雪花飘 多线程java”这个项目中,我们的目标是利用多线程来实现一个视觉效果:在窗口中有多朵雪花随机地...

    Java 80 道面试题及答案.docx

    double 和 long 都是 64 位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。...

    Java测试题2答案

    定义一个类名为"MyClass.java"的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明应为:CD A double a=1.0; A private class MyClass extends Object B class MyClass extends Object C ...

    华为java面试题华为面试题绝对精辟

    * Java 中的基本数据类型包括 byte、short、int、long、float、double、boolean、char 等。 * Java 中的异常处理机制包括 try-catch 语句和 throws 关键字。 * Java 中的集合框架包括 ArrayList、LinkedList、Vector...

    Java 60 道面试题及答案.docx

    Java 中各种数据的默认值有 Byte、short、int、long 等整形默认为 0,Boolean 默认为 false,Char 类型的默认值是 ’ ’,Float 和 double 类型的默认值是 0.0,对象类型的默认值是 null。 2. Java 中有哪些常用包...

    java100道选择题含答案

    Java 中的整型数据类型有 byte、short、int、long 四种,按需内存空间大小排序为 byte < short < int < long。 面向对象编程 4. Java 类可以作为?(C)答案:类型定义机制和数据封装机制 Java 类可以作为类型...

    Java基础练习题400题(选择、填空、多选、简答题)

    答:Java 中的基本数据类型包括 byte、short、int、long、float、double、boolean、char 等,它们是 Java 语言的基本组成部分。 Java 测试是 Java 开发者必备的基础知识测试,通过 Java 测试可以了解自己的 Java ...

    Java技巧:多线程程序设计二十三个要点

    14. **volatile变量**:volatile保证了变量在所有线程间可见性和简单的原子性,适用于long和double等非原子操作的变量。 15. **yield()与sleep()**:`yield()`让当前线程暂停,但不释放锁,可能更快地恢复执行。`...

    Java面试宝典.pdf

    instanceof是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例。 Java自动装箱与拆箱 装箱:自动将基本数据类型转换为包装器类型(int-->Integer),调用方法:Integer的valueOf(int)。 拆箱:自动将...

Global site tag (gtag.js) - Google Analytics