用最簡單語言概括乙個功能點是乙個好的程式設計師應該做的
先閒聊一波:
一般用syn鎖,但是這個鎖沉重,粗苯,一鎖基本上別人想都別想呼叫
經典的案例:hashtable
執行緒安全,用的就是sync鎖,put get方法都加了sync關鍵字修飾,導致只要有人呼叫,別人就別想動,只能排隊,排到死,嚴重影響效率,雖然保證了同步,但是尼瑪你保證同步是讓我們排隊等,差評.
那麼有沒有一種輕量化的鎖呢?
有,這種鎖叫cas,配合volatile一起使用
輕量化的鎖,只能修飾基本資料型別+string型別 其餘的型別比如物件型別,對不起,請你回去用sync去.
但是你使用它還有個前提就是他只支援原子操作,啥叫原子操作呢?
原子,不可再分那種,屬於那種執行了要麼成功要麼失敗,沒有中途休息兩分鐘的那種,模擬sql的原子性啦,沒啥好說的,主要說下非原子性的
eg:n = n + 1;
n++;
如果當前值由該變數以前的值相關,那麼volatile關鍵字不起作用
所以如果你要使用它,你得繞開他。
當然,如果只有乙個執行緒寫,他娘的都沒有多執行緒,還考慮個毛線,原子操作也沒啥事,因為單執行緒操作,又沒有執行緒併發的問題對吧,哈哈哈。
大家如果要深挖為啥他能保證同步呢,這個大家看看別人的資料吧,其實說白了也簡單是強制讀取記憶體,write before read 讀取之前有更新強制更新後再讀取,給大家乙個鏈結,如果有興趣大家點開看看
總結:大膽的使用,不要怕,老子就是程式設計師,程式在手,天下我有,網上還讓我們不要隨便用,繞開上面的點,兄弟大膽的往前走
追加說明:
volitatile具有兩個特性,可見性,有序性
核心點在於可見性,可以看到其餘的執行緒對該字段的修改,這點很重要,能夠即時的獲取最新值。cas需要獲取最新的值以及原始的值進行對比,來實現無鎖機制
參考文獻
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
Java併發程式設計 volatile關鍵字解析
reference 總結 三種併發 synchronized,volatile,lock synchronized單執行緒,執行緒安全,但效率不足 volatile 能保證可見性,順序性,但是不能保持原子性,特別是在i 並不總是執行緒安全的 volatile 變數具有 synchronized 的可...
關鍵字volatile詳解
與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...