JAVA 記憶體模型和執行緒安全

2021-09-19 03:19:07 字數 954 閱讀 3165

原子性:

原子性是指乙個操作是不可中斷的。即使是在多個執行緒一起執行的時候,乙個操作一旦開始,就 不會被其它執行緒干擾。 i++ 不是原子操作

有序性一條指令的執行是可以分為很多步驟的

–    取指if 

–  解碼和取暫存器運算元 id

–  執行或者有效位址計算 ex

–  儲存器訪問 mem

–  寫回wb

可見性可見性是指當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。

– 編譯器優化

– 硬體優化(如寫吸收,批操作)

1、程式順序原則:乙個執行緒內保證語義的序列性

2、volatile規則:volatile變數的寫,先發生於讀,這保證了volatile變數的可見性

3、鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前

4、傳遞性:a先於b,b先於c,那麼a必然先於c

5、執行緒的start()方法先於它的每乙個動作

6、執行緒的所有操作先於執行緒的終結(thread.join())

7、執行緒的中斷(interrupt())先於被中斷執行緒的**

8、物件的建構函式執行結束先於finalize()方法

執行緒安全的概念

指某個函式、函式庫在多執行緒環境中被呼叫時,能夠正確地處理各個執行緒的區域性變數,使程式功 能正確完成

public class accountingsync implements runnable {

static accountingsync instance = new accountingsync();

static int i = 0;

@override

public void run() {

for (int j = 0; j < 10000000; j++) {

synchronized (instance) {

i++;

Java執行緒安全和非執行緒安全

arraylist是非執行緒安全的,vector是執行緒安全的 hashmap是非執行緒安全的,hashtable是執行緒安全的 stringbuilder是非執行緒安全的,stringbuffer是執行緒安全的 什麼是執行緒安全?執行緒安全和非執行緒安全有什麼區別?分別在什麼情況下使用?非執行緒安...

java記憶體模型

一 原子性 原子性是指乙個操作是不可中斷的,即使是多個執行緒一起執行的時候,乙個操作的開始,就不會被其他執行緒干擾 那麼有人會想到 i 是原子操作嗎?答案肯定不是。因為i 至少包含兩個操作,讀 從記憶體中讀出來 和行為 加上去 還有可能把加完後的資料在方法到i裡面去,出來也是1,這兩個執行緒同時進行...

Java記憶體模型

1.首先,執行緒a把本地記憶體a中更新過的共享變數重新整理到主記憶體中去。2.然後,執行緒b到主記憶體中去讀取執行緒a之前已更新過的共享變數。1.共享物件對各個執行緒的可見性 2.共享物件的競爭現象 指令級並行的重排序 如果不存l在資料依賴性,處理器可以改變語句對應機器指令的執行順序。記憶體系統的重...