volatile的兩大性質

2021-10-09 14:20:16 字數 2506 閱讀 1933

一、可見性

public

class

public

void

load()

catch (interruptedexception e) */

/** * 3、println,也可以跳出while迴圈 -------- 能

* synchronized 可見性保證 記憶體屏障

*/"-----------");

/** * 4、shortwait()休眠納秒

*///休眠1秒 ----- 能

//shortwait(1000000); 快取是否失效,執行緒棧中的快取有個過期時間

//休眠0.1秒 ---- 不能

//shortwait(1000);

} system.out.

println

(thread.

currentthread()

.getname()

+"jump for: i= "

+ i);}

public

static

void

main

(string[

] args)

catch

(interruptedexception e)

}//1毫秒=1000微秒 1毫秒=1000 000納秒

上圖中是硬體架構,其實jmm記憶體模型和這個模型是一樣的,只不過jmm操作的各個邏輯塊,其實底層都是和上面的各個硬體有對映關係。

volatile的可見性其實就是利用了快取一致協議(鎖快取行)(mesi)(m:修改

修改當前快取中的共享變數對於當前執行緒來說是執行緒安全的,但是對被volatile修飾的變數來說,多個執行緒共同操作這個變數的時候,這個過程就不是執行緒安全的,所以volatile並不是執行緒安全的。下面是乙個例子

private

static

volatile

long sum =0;

public

static

void

main

(string[

] args)})

.start()

;}system.out.

println

(sum)

;//sum每次輸出來的值,都不是我想要的

}

注意:如果多個核的執行緒在操作同乙個快取行中的不同變數資料,那麼就會出現頻繁的快取失效,即使在**層面看這兩個執行緒操作的資料之間完全沒有關係。這種不合理的資源競爭情況就是偽共享

public

class

falsesharing

catch

(interruptedexception e)

}private

static

void

testpointer

(pointer pointer)

throws interruptedexception })

; thread t2 =

newthread((

)->})

; t1.

start()

; t2.

start()

; t1.

join()

; t2.

join()

; system.out.

println

(system.

currenttimemillis()

- start);}

}class

pointer

二、有序性(實現了相當於記憶體屏障的功能)

public

class

reorder}}

return myinstance;

}public

static

void

main

(string[

] args)

}

為什麼會有重排序呢???

從上圖中可以看出來(1)(2)執行的結果都一樣,但是對應的資料載入的指令卻不一樣,乙個load代表從記憶體中載入一次資料通過快取記憶體到cpu的過程,如果有重排序,那麼就會減少一次這樣的過程,這樣的效能就比較高

兩大搜尋 tu的遍歷

在我們遇到的一些問題當中,有些問題我們不能夠確切的找出數學模型,即找不出一種直接求解的方法,解決這一類問題,我們一般採用搜尋的方法解決。搜尋就是用問題的所有可能去試探,按照一定的順序 規則,不斷去試探,直到找到問題的解,試完了也沒有找到解,那就是無解,試探時一定要試探完所有的情況 實際上就是窮舉 深...

GRE考試寫作的兩大技巧

gre寫作技巧運用好gre寫作范文,它是最好的備考素材,gre閱讀部分的文章也是我們有針對性地閱讀的乙個素材庫,要扎扎實實地提高英語gre考試寫作水平,就必須要以扎扎實實的閱讀量為前提之一,必須體會地道的 漂亮的語言是怎麼寫出來的,通過對范文的語言內容和邏輯的理解來學習gre考試寫作中詞彙的使用 句...

django中queryset的兩大特性

roles roleinfo.objects.all 建立查詢集的時候,是不會訪問資料庫的,直到真正的呼叫資料的時候,才會訪問資料庫,所以 roles roleinfo.objects.all 沒有真正的進行資料庫查詢的,只是建立了乙個資料庫查詢集 呼叫資料,真正的使用資料 1 迭代 2 序列化 3...