問二十五:long、double是原子操作嗎?

當線程在沒有固步的情況下讀取變量時,可能會得到一個失效值,但至少這個值是由之前某個線程設置的值,而不是一個隨機值。這種安全性保證也被稱爲最低安全性( out-of-thin-air safety)

最低安全性適用於絕太多數變量,但是存在一個例外:非volatile類型的64位數值變量。Java內存模型要求,變量的讀取操作和寫入操作都必須是原子操作,但對於非volatile類型的long和double變量,JVM允許將64位的讀操作或寫操作分解爲兩個32位的操作

當讀取一個非volatile類型的long變量時,如果對該變量的讀操作 和寫操作在不同的線程中執行,那麼很可能會讀取到某個值的髙32位和另一個值的低32位

因此,即使不考慮失效數據問題,在多線程程序中使用共享且可變的long和double等類型的 變量也是不安全的,除非用關鍵字volatile來聲明它們,或者用鎖保護起來

 

但是在現在的主流商用虛擬機中,一般是能夠將long和double的運算視爲原子操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章