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過來獲取鎖,因為鎖記錄的...