volatile 对于long和double类型的原子性

问题描述

在对boolean和int的基本类型get和set的时候,java保证原子性。但是对没有volatile修饰的long和double类型不保证,原因是long和double是64位的。难道加了volatile就保证了?volatile只是保证了可见性啊。没有保证原子性啊。。不解,求大牛解释!!!

解决方案

因为set int的时候只需要一步操作,而set long的时候需要两步。如果是int i; i++的话 这时候i++也是不保证原子性的,不管是不是volatile,因为有两步操作。所以volatile只是保证了可见性,没有保证原子性。一步操作永远是原子的,这个不是volatile来保证的。即使不用volatile,给int赋值也是原子的。

时间: 2024-11-08 22:07:52

volatile 对于long和double类型的原子性的相关文章

double类型结构体对齐的疑惑

问题描述 double类型结构体对齐的疑惑 32bit的cpu,在msvc中如果结构体有double类型,则以8字节对齐,例如 struct test { char ch; double j; }; ch也会占用8个字节,而32bit的cpu会一次性取到8个字节么?难道不是32bit,4个字节? 为什么要以8个字节来对齐呢?谢谢 解决方案 如果编译器为sse优化,那么是按照128bit,也就是8字节对齐的,如果编译器为sse2优化,那么是按照16字节对齐的.http://www.xuebuyua

c++-C++ float类型和double类型的输出

问题描述 C++ float类型和double类型的输出 在VS2012下,用cout<<输出float和double,为什么精度都只有6位? 解决方案 http://blog.sina.com.cn/s/blog_a459dcf501013g39.htmlhttp://wenda.so.com/q/1371005504064718 解决方案二: setprecision Sets the decimal precision used to represent floating-point v

Java的double类型探索.

一.double类型的存储表示 Java的浮点类型表示完全按照IEEE754标准(Standards of IEEE 754 floating point numbers),有兴趣可以上IEEE标准网站(www.ieee.org)查阅.该标准的内容基本上描述了浮点类型的存储格式(Storage Layout),下面我从中总结几段,来概括该标准,详细信息请查阅标准原文. 1.什么是浮点数. 计算机上表达实数有两中方法:定点表示(fixed-point)和浮点表示(floating-point).定

java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)

 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1. 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情. 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错.  首先贴一个使用的代码: /** * 将double类型数据转为字符串(如将18.4转为1840,如果需要1840.0,把int强转去掉即可) * @par

c++ mfc-MFC中如何判断编辑框中输入的数值是double类型的

问题描述 MFC中如何判断编辑框中输入的数值是double类型的 MFC中如何判断编辑框中输入的数值是double类型的,用了typeid,if(typeid(m_test) == typeid(double)){......},发现没用呀 ,求大神告知方法,不胜感激 解决方案 你获取编辑框的值都是字符串类型的.那问题就是判断字符串了

printf-(c语言)利用%ld读取double类型,程序可以运行,但是结果是很大的负数?

问题描述 (c语言)利用%ld读取double类型,程序可以运行,但是结果是很大的负数? #include #define TAX_1 17850 #define TAX_2 23900 #define TAX_3 29750 #define TAX_4 14875 #define TAXRATE_1 0.15 #define TAXRATE_2 0.28 int main(void) { double taxsalary,taxpay; int n; printf("Please enter

java中double类型的值如何实现科学计数法

问题描述 java中double类型的值如何实现科学计数法 java中,一个double类型的数值,如何在显示的时候是科学计数法 解决方案 它达到一定的值,就会显示成科学计数格式,当然你可以自己这个格式化方法任意转 解决方案二: 小数位数多了自动科学计数法表示的吧.

double类型-通过调用函数max_ab实现求a与b的最大值输出,并定义函数max_ab。

问题描述 通过调用函数max_ab实现求a与b的最大值输出,并定义函数max_ab. 从键盘输入两个double类型数据啊,a,b,通过调用函数max_ab实现求a与b的最大值输出,并定义函数max_ab. 解决方案 #include main () { void max_ab(float a,float b); float a,b; printf ("nnt请输入a,b用空格隔开:"); scanf ("%f%f",&a,&b); max_ab(a

误差-Java的double类型在运算时,结果有的时候不能精确显示。我知道是进制导致的。

问题描述 Java的double类型在运算时,结果有的时候不能精确显示.我知道是进制导致的. 下图讲解,我懂. 但是,在做题的时候............. 才发现,我也只能确定0.1不能被精确显示,具体该如何解这样的题呢? 其实我进一步思考了.我以为就看尾数是不是5.比如0.5.0.05.因为2的-x次方的尾数都是5.是5就能精确显示,不是就不能.但是后来发现.................计算误差"> 说明不能只靠最终结果来判断...............那该怎么判断啊? 问题补充