什么是线程安全,你真的了解吗
轉載自??什么是線程安全,你真的了解嗎
記得今年3月份剛來杭州面試的時候,有一家公司的技術總監問了我這樣一個問題,說你給我說說有哪些線程安全的類,我心里一想,呵呵,這我早都背好了,稀里嘩啦說了一大堆,那你再來說說什么是線程安全,然后就GG了,說真的,我們整天說線程安全,但是你對什么是線程安全真的了解嘛?說真的,我之前真的是了解甚微,那么我們今天就來聊聊這個問題。
再說什么是線程安全之前我們先來聊聊什么是進程。
1、什么是進程?
先來看一張圖
我們看到的這些單獨運行的程序就是一個獨立的進程,進程之間是相互獨立存在的。
我們上面圖中的QQ、酷狗播放器、電腦管家等等都是獨立的進程。
?
2、什么是線程?
上面簡單的說了一下什么是進程,進程想要執行任務需要依賴線程,換句話說就是進程中的最小執行單位就是線程,并且一個進程中至少有一個線程。
?
3、什么是多線程?
提到多線程這里要說兩個概念,就是串行和并行,搞清楚這個我們才能更好的理解多線程。
所謂串行其實是相對于單條線程來執行多個任務來說的,我們就拿下載文件來舉個例子,我們下載多個文件,在串行中它是按照一定的順序去進行下載的,也就是說必須等下載完A之后,才能開始下載B,它們在時間上是不可能發生重疊的。
并行:下載多個文件,開啟多條線程,多個文件同時進行下載,這里是嚴格意義上的在同一時刻發生的,并行在時間上是重疊的。
了解了這兩個概念之后我們再來說說什么是多線程,舉個例子,我們打開騰訊關鍵,騰訊關鍵本身就是一個程序也就是說它就是一個進程,它里面有很多的功能,我們可以看下圖,能查殺病毒、清理垃圾、電腦加速等眾多功能,按照單線程來說,你想要清理垃圾還要病毒查殺,那么你必須先做完其中的一件事才能做下一件事,是有一個執行的順序的,如果是多線程的話,我們其實在清理垃圾的時候還可以查殺病毒、電腦加速等等其他的操作,這個是嚴格意義上的同一時刻發生的,沒有執行的先后順序。
一句話總結一下:一個進程運行時產生了多個線程。
華麗的分割線
在了解完這個問題后,我們又需要去了解一個使用多線程不得不考慮的問題,線程安全,今天我們不說如何保證一個線程的安全,我們聊聊什么是線程安全?因為我之前面試被問到了,說真的,我之前真的不是特別了解這個問題,我們好像只學如何確保一個線程安全,卻不知道所謂的安全到底是什么!
?
4、什么是線程安全?
既然是線程安全問題,那么毫無疑問所有的隱患都是出現在多個線程訪問的情況下產生的,也就是我們要確保在多條線程訪問的時候,我們的程序還能按照我們預期的行為去執行,我們看一下下面的代碼。
Integer count =?0;public?void?getCount()?{count ++;System.out.println(count);}很簡單的一段代碼,我們就來統計一下這個方法的訪問次數,多個線程同時訪問會不會出現什么問題,我開啟的3條線程每個線程循環10次,得到一下結果
我們可以看到,這里出現了兩個26,為什么會出現這種情況,出現這種情況顯然表明我們這個方法根本就不是線程安全的,出現這種問題的原因有很多,我們說最常見的一種,就是我們A線程在進入方法后,拿到了count的值,剛把這個值讀取出來還沒有改變count的值的時候,結果線程B也進來的,那么導致線程A和線程B拿到的count值是一樣的。
那么由此我們可以了解這確實不是一個線程安全的類,因為他們都需要操作這個共享的變量,其實要對線程安全問題給出一個明確的定義還是蠻復雜的,我們根據我們這個程序來總結下什么是線程安全。
?
當多個線程訪問某個方法時,不管你通過怎樣的調用方式或者說這些線程如何交替的執行,我們在主程序中不需要去做任何的同步,這個類的結果行為都是我們設想的正確行為,那么我們就可以說這個類時線程安全的。
總結
以上是生活随笔為你收集整理的什么是线程安全,你真的了解吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓加速齿轮免root(安卓加速齿轮)
- 下一篇: 面试必考的网络协议相关题目应该如何回答