深入探析Java執行緒鎖機制

2021-09-01 09:42:28 字數 1214 閱讀 1632

先看幾段**吧!

**一:

public class testmultithread2 implements runnable

} flag.incrementandget();

} public static void main(string args) throws interruptedexception

thread.sleep(50);

} }

}

為了方便看,重複的就不插入了,從**二到**四隻插入run()方法中的**,其他地方都一樣

**二:

public void run() 

} flag.incrementandget();

}

**三:

public void run() 

} flag.incrementandget();

}

**四: 

public void run() 

} flag.incrementandget();

}

有了這四段**我想問題大概可以說明白了,這裡說一下輸出吧。

**一:<4000000

**二:=4000000

**三:<4000000

**四:<4000000(ps:這個結果非常接近4000000)

這裡說明一下我測試中碰到的問題,**四一直沒有跑出我想要的結果,主要是開始我設的迴圈次數太少,其實這裡如果要這個現象更加明顯一些可以在中間多new 幾個object 如下面的**五,這樣現象就比較明顯了。

**五:

public void run() 

o = temp;

}} flag.incrementandget();

}

為什麼會出現上面的現象:

**一:當si做++操作後(可以直接看位元組碼,這裡不貼了)在putstatic之前有幾步操作,就是我們常說的非原子操作,而這時候si已經不是原來的物件了,這樣鎖對另外乙個執行緒來說就失效了,我想**三和**四就是最好的佐證,**四更有說服力。當時因為沒有出現預想的情況困惑了挺久。

其實這裡用位元組碼來解釋還不是很嚴謹,最好的當然直接是彙編**

如有什麼問題還希望各位讀者指正。

深入探析Java執行緒鎖機制

先看幾段 吧!一 public class testmultithread2 implements runnable flag.incrementandget public static void main string args throws interruptedexception thread...

執行緒鎖機制

互斥量 也稱為互斥鎖 出自posix執行緒標準,可以用來同步同一程序中的各個執行緒。當然如果乙個互斥量存放在多個程序共享的某個記憶體區中,那麼還可以通過互斥量來進行程序間的同步。互斥量,從字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用於保護臨界區 共享資源 以保證在任何時刻只有乙個執行緒...

Java執行緒鎖

學習多執行緒大家都對它的鎖感到鬱悶,一般它的鎖物件可以有object,當前類物件this,以及修飾static方法時的類class檔案。比如對於同步 塊 while true catch interruptedexception e system.out.println thread.current...