首页 > 编程语言 >JAVA 多线程基础:JAVA中double 和 long非原子读写问题

JAVA 多线程基础:JAVA中double 和 long非原子读写问题

时间:2024-09-16 18:20:02浏览次数:3  
标签:JAVA double 64bit System long number 32bit JVM 多线程

在解释这个问题之前,我们先来回顾下Java中基础数据类型所占的位数。

类型长度(位)字节
byte41
boolean41
int324
short162
long648
char162
float324
double648

可以看到对于double以及long两种基本数据类型,所占位数为64位。

而JVM却有32bit与64bit两种,也就是说在32bit JVM中不能将double 与 long类型的数据在一条指令中进行处理。为了处理64bit的数据,32bit的JVM会将一次对64bit的数据操作变为两次对32bit的操作。

具体来说,64bit的普通 long和double 数据在 32bit的JVM中 会被分为上32bit下32bit。

在一次读或写中,JVM将会分别读取 下32bit与上32bit。

代码演示


/**
 * double long 并发读写问题
 *
 * @author eventime
 */
public class DoubleLongTest {
    static long  number = 0L;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            int i = 0;
            while (i < 100000) {
                i ++;
                number = 4294967296L;
                long temp = number;
                if (temp != 4294967296L && temp != 1L) {
                    System.out.println(temp);
                    System.out.println("出现并发错误");
                    System.out.println("test1:" + i);
                    System.exit(0);
               }
            }
        });
        Thread t2 = new Thread(() -> {
            int i = 0;
            while (i < 100000) {
                i ++;
                number = 1L;
                long temp = number;
                if (temp != 4294967296L && temp != 1L) {
                    System.out.println(temp);
                    System.out.println("出现并发错误");
                    System.out.println("test2:" + i);
                    System.exit(0);
                }
            }
        });

        String arch = System.getProperty("sun.arch.data.model");
        System.out.println(arch+"-bit");
        t2.start();
        t1.start();
        t1.join();
        t2.join();
    }
}

上文的代码中,我定义了t1,t2两个线程。两线程都是更改一个不加锁的静态变量number并且判断输出。

运行程序我们可能得到下面的结果:

32-bit

出现并发错误

错误值为:0

32-bit

出现并发错误

错误值为:4294967297

32-bit

如果还记并发编程中的竞态条件问题,按理来说上面程序在启动后 number应该为4294967296L或者1L。但是为什么会出现0L和:4294967297L呢?

让我们观察两个线程的具体执行过程:

t1负责每次循环将静态变量number赋值为 4294967296L, 这个数字的二进制表示为

000000000000000000000000000000001 0000000000000000000000000000000

可以看到他的下32位全部为0;

t2负责每次循环将静态变量number赋值为 1L, 这个数字的二进制表示为

000000000000000000000000000000000 0000000000000000000000000000001

可以看到他的上32位全部为0;

在线程的执行过程中,由于long这样的64bit数据读写并不是原子的,所以对其数据的操作将会分为上32bit与下32bit。

正常情况如图所示,操作时序图期望应该是这样,读出的数据要么是1L要么是4294967296L。

画板

但是由于写入和读取并非原子操作,所以可能出现以下的时序错误:

得到4294967297L

画板

得到0L

画板

解决方案

解决double long非原子读写问题的方案很简单。

  1. 使用64bit的JVM,在64bit中,对于64bit的数据读写默认为原子类型。
  2. 在32bit的JVM中,对long double这样的数据添加 volatile 关键字。添加后JVM便会将double long的读写变为原子读写。

标签:JAVA,double,64bit,System,long,number,32bit,JVM,多线程
From: https://blog.csdn.net/TonyAlexer/article/details/142303960

相关文章

  • 计算机毕业设计:JAVA在线考试系统演示 引言
    计算机毕业设计:JAVA在线考试系统演示引言随着信息技术的飞速发展,教育领域也在不断地进行数字化转型。在线考试系统作为一种新型的考试方式,不仅提高了考试效率,还为学生和教师提供了更加便捷的考试管理工具。本文将详细介绍一个基于JAVA的在线考试系统的设计与实现,并通过演示展示其主......
  • 开题报告:Java计算机毕业设计——码上招聘云平台
    开题报告:Java计算机毕业设计——码上招聘云平台一、选题背景与意义随着互联网技术的飞速发展,招聘行业也在不断变革。传统的招聘方式,如报纸招聘、人才市场招聘等,已经无法满足现代企业的需求。企业需要更高效、更精准的招聘方式,而求职者也希望能够更便捷地找到适合自己的工作。因此,开......
  • 如何基于Java解析国密数字证书
    一、说明随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色。国密算法,作为我国自主研发的加密算法标准,其应用也愈发广泛。然而,在Java环境中解析使用国密算法的数字证书时,我们可能会遇到一些挑战。本文主要分享如何在Java中解析采用SM3WITHSM2......
  • JavaScript 上下文 和 执行栈
    执行上下文执行上下文是对JavaScript代码执行环境的概念抽象,只要有js代码运行,它就一定运行在执行上下文中执行上下文分为三种全局执行上下文:也就是浏览器的全局对象window函数执行上下文:每次函数被调用时都会(才会)创建一个新的执行上下文Eval执行上下文:运行在Eval函数中......
  • 【Java+GDAL】读取shp文件的坐标信息(坐标系+EPSG码)
    文章目录前言一、GDAL和Java版本二、代码实现1.引入gdal环境2.读取坐标信息3.测试使用总结前言之前写了几篇与shp字段相关的文章。【Java+GDAL】shp新增属性字段与删除属性字段【Java+GDAL】读取shp信息(字段、要素属性等)Java使用gdal更改shp要素的字段属性值Ja......
  • 【Java+GDAL】读取shp文件图层几何类型
    文章目录前言一、GDAL和Java版本二、代码实现1.引入gdal环境2.代码实现3.ogrConstants中的几何类型总结前言今天继续Java+GDAL,之前写的几篇处理shp的文章包括:【Java+GDAL】读取shp文件的坐标信息(坐标系+EPSG码)【Java+GDAL】shp新增属性字段与删除属性字段【Java......
  • java+vue计算机毕设大学生掌上校园app【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已成为大学生日常生活中不可或缺的一部分。在信息化时代背景下,高校校园管理与学生服务正逐步向数字化、智能化......
  • java+vue计算机毕设大数据背景下大学生个性化学习系统的构建【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,大数据已成为推动社会进步与产业升级的重要力量。在教育领域,大数据技术的应用正深刻改变着传统的教学模式与学习方式。当前,高......
  • java+vue计算机毕设大学生社团活动管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及与校园文化的日益丰富,大学生社团活动已成为促进学生全面发展、增强实践能力、培养团队合作精神的重要平台。然而,传统的手工管理方......
  • java+vue计算机毕设大学生心理咨询管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及与深入,大学生群体面临的学业压力、人际关系、职业规划等多重挑战日益凸显,心理健康问题已成为不容忽视的社会议题。传统的心理咨询......