日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發(fā)布時間:2025/3/21 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是线程安全,你真的了解吗? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

記得今年3月份剛來杭州面試的時候,有一家公司的技術總監(jiān)問了我這樣一個問題,說你給我說說有哪些線程安全的類,我心里一想,呵呵,這我早都背好了,稀里嘩啦說了一大堆,那你再來說說什么是線程安全,然后就GG了,說真的,我們整天說線程安全,但是你對什么是線程安全真的了解嘛?說真的,我之前真的是了解甚微,那么我們今天就來聊聊這個問題。

在說什么是線程安全之前我們先來聊聊什么是進程。

?

1、什么是進程?

先來看一張圖

我們看到的這些單獨運行的程序就是一個獨立的進程,進程之間是相互獨立存在的。

我們上面圖中的QQ、酷狗播放器、電腦管家等等都是獨立的進程。

所以說進程是正在運行的程序。

?

2、什么是線程?

?

上面簡單的說了一下什么是進程,進程想要執(zhí)行任務需要依賴線程,換句話說就是進程中的最小執(zhí)行單位就是線程,并且一個進程中至少有一個線程。

?

3、什么是多線程?

?

提到多線程這里要說兩個概念,就是串行和并行,搞清楚這個我們才能更好的理解多線程。

所謂串行其實是相對于單條線程來執(zhí)行多個任務來說的,我們就拿下載文件來舉個例子,我們下載多個文件,在串行中它是按照一定的順序去進行下載的,也就是說必須等下載完A之后,才能開始下載B,它們在時間上是不可能發(fā)生重疊的。

并行:下載多個文件,開啟多條線程,多個文件同時進行下載,這里是嚴格意義上的在同一時刻發(fā)生的,并行在時間上是重疊的。

了解了這兩個概念之后我們再來說說什么是多線程,舉個例子,我們打開騰訊管家,那么我們就啟動了一個進程,它里面有很多的功能,我們可以看下圖,能查殺病毒、清理垃圾、電腦加速等眾多功能,按照單線程來說,你想要清理垃圾還要病毒查殺,那么你必須先做完其中的一件事才能做下一件事,是有一個執(zhí)行的順序的,如果是多線程的話,我們其實在清理垃圾的時候還可以查殺病毒、電腦加速等等其他的操作,此時我們開啟了多個線程去執(zhí)行多個操作。

在了解完這個問題后,我們又需要去了解一個使用多線程不得不考慮的問題,線程安全,今天我們不說如何保證一個線程的安全,我們聊聊什么是線程安全?因為我之前面試被問到了,說真的,我之前真的不是特別了解這個問題,我們好像只學如何確保一個線程安全,卻不知道所謂的安全到底是什么!

?

?

4、什么是線程安全?

既然是線程安全問題,那么毫無疑問所有的隱患都是出現(xiàn)在多個線程訪問的情況下產生的,也就是我們要確保在多條線程訪問的時候,我們的程序還能按照我們預期的行為去執(zhí)行,我們看一下下面的代碼。

Integer count =?0;public?void?getCount()?{count ++;System.out.println(count);}

很簡單的一段代碼,我們就來統(tǒng)計一下這個方法的訪問次數(shù),多個線程同時訪問會不會出現(xiàn)什么問題,我開啟的3條線程每個線程循環(huán)10次,得到一下結果

我們可以看到,這里出現(xiàn)了兩個26,為什么會出現(xiàn)這種情況,出現(xiàn)這種情況顯然表明我們這個方法根本就不是線程安全的,出現(xiàn)這種問題的原因有很多,我們說最常見的一種,就是我們A線程在進入方法后,拿到了count的值,剛把這個值讀取出來還沒有改變count的值的時候,結果線程B也進來的,那么導致線程A和線程B拿到的count值是一樣的。

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

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

?

PS:那么你知道有哪些方法可以保證線程安全嗎?

歡迎大家在留言區(qū)留言

總結

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

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