1.volatile 數(shù)組嗎?
可以四濒,但是創(chuàng)建的對象或數(shù)組的地址具有可?性歼捐,??的數(shù)據(jù)是不可?的
2.volatile 類型變量提供什么保證轨蛤?能使得?個?原?操作變成原?操作嗎
volatile 提供 happens-before 的保證,確保?個線程的修改能對其他線程是可?的终议。
在Java 中除了 long 和 double 之外的所有基本類型的讀和賦值汇竭,都是原?性操作葱蝗。?64位的
long 和 double 變量由于會被JVM當(dāng)作兩個分離的32位來進?操作,所以不具有原?性细燎,會產(chǎn)
?字撕裂問題两曼。但是當(dāng)你定義long或double變量時,如果使? volatile關(guān)鍵字玻驻,就會獲到(簡單
的賦值與返回操作的)原?性
3.什么是原?操作
所謂原?操作是指不會被線程調(diào)度機制打斷的操作悼凑;這種操作?旦開始,就?直運?到結(jié)束璧瞬,
中間不會有任何 context switch (切 [1] 換到另?個線程)户辫。
volatile 變量是什么?volatile 變量和 atomic 變量有什么不同
volatile則是保證了所修飾的變量的可?彪蓬。因為volatile只是在保證了同?個變量在多線程中的可
?性寸莫,所以它更多是?于修飾作為開關(guān)狀態(tài)的變量,即Boolean類型的變量档冬。
volatile多?于修飾類似開關(guān)類型的變量膘茎、Atomic多?于類似計數(shù)器相關(guān)的變量、其它多線程并
發(fā)操作?synchronized關(guān)鍵字修飾酷誓。
volatile 有兩個功?
1. 這個變量不會在多個線程中存在復(fù)本披坏,直接從內(nèi)存讀取。
2. 這個關(guān)鍵字會禁?指令重排序優(yōu)化盐数。也就是說棒拂,在 volatile 變量的賦值操作后?會有?個
內(nèi)存屏障(?成的匯編代碼上),讀操作不會被重排序到內(nèi)存屏障之前玫氢。
4.如何確保N個線程可以訪問N個資源同時?不導(dǎo)致死鎖帚屉?
使?多線程的時候,?種?常簡單的避免死鎖的?式就是:指定獲取鎖的順序漾峡,并強制線程按
照指定的順序獲取鎖攻旦。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖生逸,就不會出 現(xiàn)死
鎖了牢屋。