long和double型別變數的非原子性問題

2021-08-21 01:40:12 字數 290 閱讀 6032

32位的基本型別的操作都是原子操作,

但是某些jvm對long和double型別的操作並不是原子操作,這樣就會造成錯誤資料的出現。

這樣記憶體中的值變成執行緒1的高32位值和執行緒2的低32位值的組合,是個錯誤的值。 

書中還提到,上面出現問題的long和double變數是沒有宣告為volatile的變數。

jvm可以很輕易的將變數操作變成原子性的,但是卻受到了當前硬體的約束,因為流行的微處理器還是32bit居多,因此64bit的變數需要拆分成兩次,但如果是64bit處理器就能滿足64bit變數的原子性操作了。

long與double和int的區別

int對於記憶體的要求最小,只能對整數進行操作 long和都double對於記憶體的要求都大,提高了資料的精度,但是對於精度的方向不同。若是輸入資料的精度比較大,會產生小數,那麼應該用double型別。使用double型別時,若是對保留的小數的位數有要求,此時常與decimalformat型別連用 ...

讀取long型別資料

create or replace function long to char utable in varchar2,uid in number return varchar2 as uval varchar2 32767 begin select data default into uval fr...

float和double型別的記憶體分布和比較方法

c c 的浮點資料型別有float和double兩種。型別float大小為4位元組,即32位,記憶體中的儲存方式如下 符號位 1 bit 指數 8 bit 尾數 23 bit 型別double大小為8位元組,即64位,記憶體布局如下 符號位 1 bit 指數 11 bit 尾數 52 bit 符號位...