日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么是线程安全,你真的了解吗

發布時間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是线程安全,你真的了解吗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??什么是線程安全,你真的了解嗎

記得今年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值是一樣的。

那么由此我們可以了解這確實不是一個線程安全的類,因為他們都需要操作這個共享的變量,其實要對線程安全問題給出一個明確的定義還是蠻復雜的,我們根據我們這個程序來總結下什么是線程安全。

?

當多個線程訪問某個方法時,不管你通過怎樣的調用方式或者說這些線程如何交替的執行,我們在主程序中不需要去做任何的同步,這個類的結果行為都是我們設想的正確行為,那么我們就可以說這個類時線程安全的。

總結

以上是生活随笔為你收集整理的什么是线程安全,你真的了解吗的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。