网站首页 | 范文大全 | 常用申请书 | 党团范文 | 讲话发言 | 作文大全 | 报告叙述 | 合同范文 | 党建教育 | 入党材料 | 心得体会 |
三晋范文网
  • 作文大全
  • 高考零分作文
  • 高考满分作文
  • 中考满分作文
  • 小学生作文
  • 初中作文
  • 高中作文
  • 您的位置:三晋范文网 > 作文大全 > 初中作文 > 正文 2019-10-16 07:31:48

    longlongdouble_Java 中 long 和 double 的原子性?唐砖 燃文

    摘要:Java 中 long 和 double 的原子性?唐砖 燃文

    前言JVM中对long的操作是不是原子操作?为什么对long的操作不是原子的?在硬件,操作系统,JVM都是64位的情况下呢?

    JAVA中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗?

    JVM中对long的操作是不是原子操作?

    首先,通过一段程序对long的原子性进行判断。测试程序如下:

    public class LongAtomTest implements Runnable { private static long field = 0; private volatile long value; public long getValue() { return value; } public void setValue(long value) { this.value = value; } public LongAtomTest(long value) { this.setValue(value); } @Override public void run() { int i = 0; while (i < 100000) { LongAtomTest.field = this.getValue(); i++; long temp = LongAtomTest.field; if (temp != 1L  temp != -1L) { System.out.println("出现错误结果" + temp); System.exit(0); } } System.out.println("运行正确"); } public static void main(String[] args) throws InterruptedException { // 获取并打印当前JVM是32位还是64位的 String arch = System.getProperty("sun.arch.data.model"); System.out.println(arch+"-bit"); LongAtomTest t1 = new LongAtomTest(1); LongAtomTest t2 = new LongAtomTest(-1); Thread T1 = new Thread(t1); Thread T2 = new Thread(t2); T1.start(); T2.start(); T1.join(); T2.join(); }}

    可以看到,程序中有两条线程t1,t2;t1,t2各自不停的给long类型的静态变量field赋值为1,-1;t1,t2每次赋值后,会读取field的值,若field值既不是1又不是-1,就将field的值打印出来

    如果对long的写入和读取操作是原子性的,那么,field的值只可能是1或者-1

    运行结果如下

    32-bit出现错误结果-4294967295运行正确

    可以看出,当线程t1,t2同时对long进行写的时候,long出天天酷跑糖伯虎视频现了既不是t1写入的值,又不是t2写入的值。可以推测,jvm中对long的操作并非原子操作。

    为什么对long的操作不是原子的?

    JVM内存模型中定义了8中原子操作:

    lock:将一个变量标识为被一个线程独占状态unclock:将一个变量从独占状态释放出来,释放后的变量才可豪车haobc以被其他线程锁定read:将一个变量的值从主内存传输到工作内存中,以便随后的load操作load:把read操作从主内存中得到的变量值放入工作内存的变量的副本中use:把工作内存中的一个变量的值传给执行引擎,每当虚拟机遇到一个使用到变量的指令时都会使用该指令assign:把一个从执行引擎接收到的值赋给工作内存中的变量,每当虚拟机遇到一个给变量赋值的指令时,都要使用该操作store:把工作内存中的一个变量的值传递给主内存,以便随后的write操作write:把store操作从工作内存中得到的变量的值写到主内存中的变量

    longlongdouble_Java 中 long 和 double 的原子性?唐砖 燃文》由(三晋范文网)整理提供,版权归原作者、原出处所有。
    Copyright © 2023 三晋范文网 All Rights Reserved. 备案号:京ICP备14001712号-1