記得今年3月份剛來杭州面試的時候,有一家公司的技術總監問了我這樣乙個問題,說你給我說說有哪些執行緒安全的類,我心裡一想,呵呵,這我早都背好了,稀里嘩啦說了一大堆,那你再來說說什麼是執行緒安全,然後就gg了,說真的,我們整天說執行緒安全,但是你對什麼是執行緒安全真的了解嘛?說真的,我之前真的是了解甚微,那麼我們今天就來聊聊這個問題。
再說什麼是執行緒安全之前我們先來聊聊什麼是程序。
1、什麼是程序?
先來看一張圖
2、什麼是執行緒?
上面簡單的說了一下什麼是程序,程序想要執行任務需要依賴執行緒,換句話說就是程序中的最小執行單位就是執行緒,並且乙個程序中至少有乙個執行緒。
3、什麼是多執行緒?
提到多執行緒這裡要說兩個概念,就是序列和並行,搞清楚這個我們才能更好的理解多執行緒。
一句話總結一下:乙個程序執行時產生了多個執行緒。
在了解完這個問題後,我們又需要去了解乙個使用多執行緒不得不考慮的問題,執行緒安全,今天我們不說如何保證乙個執行緒的安全,我們聊聊什麼是執行緒安全?因為我之前面試被問到了,說真的,我之前真的不是特別了解這個問題,我們好像只學如何確保乙個執行緒安全,卻不知道所謂的安全到底是什麼!
4、什麼是執行緒安全?
既然是執行緒安全問題,那麼毫無疑問所有的隱患都是出現在多個執行緒訪問的情況下產生的,也就是我們要確保在多條執行緒訪問的時候,我們的程式還能按照我們預期的行為去執行,我們看一下下面的**。
integer count = 0;
public
void
getcount()
很簡單的一段**,我們就來統計一下這個方法的訪問次數,多個執行緒同時訪問會不會出現什麼問題,我開啟的3條執行緒每個執行緒迴圈10次,得到一下結果
我們可以看到,這裡出現了兩個26,為什麼會出現這種情況,出現這種情況顯然表明我們這個方法根本就不是執行緒安全的,出現這種問題的原因有很多,我們說最常見的一種,就是我們a執行緒在進入方法後,拿到了count的值,剛把這個值讀取出來還沒有改變count的值的時候,結果執行緒b也進來的,那麼導致執行緒a和執行緒b拿到的count值是一樣的。
那麼由此我們可以了解這確實不是乙個執行緒安全的類,因為他們都需要操作這個共享的變數,其實要對執行緒安全問題給出乙個明確的定義還是蠻複雜的,我們根據我們這個程式來總結下什麼是執行緒安全。
當多個執行緒訪問某個方法時,不管你通過怎樣的呼叫方式或者說這些執行緒如何交替的執行,我們在主程式中不需要去做任何的同步,這個類的結果行為都是我們設想的正確行為,那麼我們就可以說這個類時執行緒安全的。
ps:那麼你知道有哪些方法可以保證執行緒安全嗎?
你真的了解什麼是程序嗎?
我們的作業系統裡面會有很多應用,比如手機裡面的各種應用,每乙個應用都有乙個或多個程序,而且每個應用執行時又會用到很多不同的資源。程序就幫助我們隔離了不同的資源,利用各種資源幫助應用管理著各種狀態,因此,我們經常說程序是資源分配的最小單位。多程序的目的是為了滿足使用者的需要,同時對多個資源進行處理,簡...
你真的了解Java嗎?
三目運算子規則 如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的類 型。換句話說,你可以通過繞過混合型別的計算來避免 煩。如果乙個運算元的型別是 t,t 表示 byte short 或 char,而另乙個運算元是乙個 int 型別的常量表示式,它的值是可以用型別 t 表示的,那麼條件表...
你真的了解restful api嗎?
在以前,乙個 的完成總是 all in one 頁面,資料,渲染全部在服務端完成,這樣做的最大的弊端是後期維護,擴充套件極其痛苦,開發人員必須同時具備前後端知識。於是慢慢的後來興起了前後端分離的思想 後端負責資料編造,而前端則負責資料渲染,前端靜態頁面呼叫指定api獲取到有固定格式的資料,再將資料展...