2021年6月30日星期三

Java 中 long 是不是原子操作?

作者:LouisWong

来源:https://my.oschina.net/u/1753415/blog/724242

Java中long和double的原子性

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中原子操作:

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

其中,与赋值,取值相关的包括 read,load,use,assign,store,write

按照这个规定,long的读写都是原子操作,与我们的实践结果相反,为什会导致这种问题呢?

对于32位操作系统来说,单次次操作能处理的最长长度为32bit,而long类型8字节64bit,所以对long的读写都要两条指令才能完成(即每次读写64bit中的32bit)。如果JVM要保证long和double读写的原子性,势必要做额外的处理。 那么,JVM有对这一情况进行额外处理吗? 针对这一问题可以参考Java语言规范文档:jls-17 Non-Atomic Treatment of double and long

For the purposes of the Java programming language memory model, a single write to a non-volatile long or double value is treated as two separate writes: one to each 32-bit half. This can result in a situation where a thread sees the first 32 bits of a 64-bit value from one write, and the second 32 bits from another write.

Writes and reads of volatile long and double values are always atomic.

Writes to and reads of references are always atomic, regardless of whether they are implemented as 32-bit or 64-bit values.

Some implementations may find it convenient to divide a single write action on a 64-bit long or double value into two write actions on adjacent 32-bit values. For efficiency's sake, this behavior is implementation-specific; an implementation of the Java Virtual Machine is free to perform writes to long and double values atomically or in two parts.

Implementations of the Java Virtual Machine are encoura......

原文转载:http://www.shaoqun.com/a/837141.html

跨境电商:https://www.ikjzd.com/

一淘网比价平台:https://www.ikjzd.com/w/1698

rfq:https://www.ikjzd.com/w/251

刘军:https://www.ikjzd.com/w/1835


作者:LouisWong来源:https://my.oschina.net/u/1753415/blog/724242Java中long和double的原子性java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗?JVM中对long的操作是不是原子操作?首先,通过一段程序对long的原子性进行
惊!641个集装箱从菲律宾马尼拉港离奇消失!原因竟是...:https://www.ikjzd.com/articles/100218
通过Q&A来了解,亚马逊站外引流小窍门 :https://www.ikjzd.com/articles/100220
产品禁卖&店铺冻结:做shopee绝对不能碰的10大深水区!:https://www.ikjzd.com/articles/100221
淡季卖家店铺如何引流?国外7大新营销渠道了解一下!:https://www.ikjzd.com/articles/100226
粗大从后面狠狠挺进 水中欢爱猛烈撞击:http://lady.shaoqun.com/a/248412.html
坐在学长的紫色巨龙上写作业 学长我坚持不住了:http://lady.shaoqun.com/m/a/247929.html
那一夜我解开了老师的裙子 老师引诱我进了她身体:http://www.30bags.com/m/a/249732.html
扒开老师双腿猛进入 挺进老师的紧窄小肉:http://www.30bags.com/m/a/249759.html
苹果发布iOS 15 Beta 2测试版,新增功能、修复Bug,该更新吗?:https://www.ikjzd.com/articles/146227
情况恶化,美国FBA仓库爆仓严重,热门大仓预约难:https://www.ikjzd.com/articles/146226
亚马逊卖家请注意:美国人正在抢购这些产品:https://www.ikjzd.com/articles/146229
当 Prime Day 不再爆单,亚马逊卖家应该做什么样的战略转移?:https://www.ikjzd.com/articles/146230

没有评论:

发表评论