网站开发公司广州,个人网上卖货的平台,云游戏主机,西安单位网站制作在java中#xff0c;除了long和double的8个字节、64位比特的变量外#xff0c;其他的基本变量都是原子性的。java存储模型要求获取和存储操作都为原子性#xff0c;但是对于非volatile的long和double变量#xff0c;jvm允许将64位的读或写划分为两个32位的操作。如果读和写…在java中除了long和double的8个字节、64位比特的变量外其他的基本变量都是原子性的。java存储模型要求获取和存储操作都为原子性但是对于非volatile的long和double变量jvm允许将64位的读或写划分为两个32位的操作。如果读和写发生在不同的线程这种情况读取一个非volatile类型long就可能会出现得到一个值的高32位和另一个值的低32位。因此即使你并不关心过期数据但仅仅在多线程程序中使用共享的、可变的long和double变量也可能是不安全的除非将它们声明为volatile或者用锁保护起来。说起原子性的操作是指读和写是原子性的比如i5;这个就是一个原子性的操作。但是两个原子性的操作合在一起进行就不一定是原子性的了比如先读后写那么就有可能在读之后这个变量被修改过。i就是这样的一个操作先读后写所以说整型变量是原子性的不是说i就是一个原子性的操作。当你使用for(int i0; i10000; i){System.out.print(i)}你会发现i到最后不会打印出10000打印出8-9千左右。但是在多线程的情况下就算整型变量是原子性的也有可能会出现线程安全的问题这个是线程可见性的问题所以需要加上volatile声明才行该修饰符是强制变量每次从内存中读取而不会存储在寄存器中。