測試jvm對double long是否原子性操作

2021-10-22 17:09:56 字數 943 閱讀 5860

public

class

test

implements

runnable

public

void

setvalue

(long value)

public

test

(long value)

@override

public

void

run(

) i++;}

system.out.

println

("執行正確");

}}public

static

void

main

(string[

] args)

throws interruptedexception

}

解釋:

如果jvm是64位的,那麼field只能是1或-1.

如果jvm是32位的,那麼

對於long和double變數,把他們作為2個原子性的32位值來對待,而不是乙個原子性的64位值,

這樣將乙個long型的值儲存到記憶體的時候,可能是2次32位的寫操作,

2個競爭執行緒想寫不同的值到記憶體的時候,可能導致記憶體中的值是不正確的結果。

1、寫入高位32位值(執行緒2)

2、寫入高位32位值(執行緒1)

3、寫入低位32位值(執行緒1)

4、寫入低位32位值(執行緒2)

即結果可能出現

32-bit出現錯誤結果-4294967295執行正確
即有執行緒t2先進行了寫入高32位值,然後被中斷,t1又進行寫入高位和低位32位值,被中斷,然後t1又寫入低32位值,導致t2中的field值前32位是0,後32位是1所以結果是4294967295為什麼是負呢,暫時不清楚

JVM對鎖的優化

作為一款公用的平台,jdk肯定也對併發程式的效能絞盡腦汁,內部也想盡一切辦法來提高併發時候的吞吐量。下面介紹幾種jdk內部的鎖優化策略 一.鎖偏向 二.輕量級鎖 如果偏向鎖失敗,虛擬機器並不會立即掛起執行緒,它還會使用一種稱為輕量級鎖的優化手段。輕量級鎖的操作也很輕便,它只是簡單的將物件的頭部作為指...

jvm對鎖的優化

jvm對鎖 sychornized 的優化開始於jdk1.6。優化的方面主要技術包括 自旋鎖 自適應自旋鎖 偏向鎖 鎖銷除 鎖粗話,輕量級鎖,重量級鎖 1自旋鎖 在鎖爭用不多 鎖占用時間比較少的情況下,自旋鎖讓執行緒去迴圈獲取鎖,這比執行緒阻塞性能更好 包括掛起或喚醒 自旋鎖預設自旋的次數是10次,...

JVM對synchronized的優化 鎖膨脹

看到這裡,你應該明白了 為什麼synchronized 中只能傳物件,不能傳基礎資料型別?基礎資料型別不是物件,沒有物件頭,也就沒有鎖資訊 tips 建議對著markword結構圖看 執行緒a再次獲取鎖,因為是偏向鎖,所以非常快 執行緒a執行一會兒後,退出了同步 塊 執行緒b過來獲取鎖,因為鎖記錄的...