1. 程式人生 > >什麼是執行緒安全,你真的瞭解嗎

什麼是執行緒安全,你真的瞭解嗎

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

那麼由此我們可以瞭解這確實不是一個執行緒安全的類,因為他們都需要操作這個共享的變數,其實要對執行緒安全問題給出一個明確的定義還是蠻複雜的,我們根據我們這個程式來總結下什麼是執行緒安全。

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

相關推薦

什麼是執行安全真的瞭解

記得今年3月份剛來杭州面試的時候,有一家公司的技術總監問了我這樣一個問題,說你給我說說有哪些執行緒安全的類,我心裡一想,呵呵,這我早都背好了,稀里嘩啦說了一大堆,那你再來說說什麼是執行緒安全,然後就GG了,說真的,我們整天說執行緒安全,但是你對什麼是執行緒安全真的瞭解嘛?

Java中執行真的瞭解會用

在《 深入原始碼分析Java執行緒池的實現原理 》這篇文章中,我們介紹過了Java中執行緒池的常見用法以及基本原理。 在文中有這樣一段描述: 可以通過Executors靜態工廠構建執行緒池,但一般不建議這樣使用。 關於這個問題,在那篇文章中並沒有深入的展開。作者之所以這

Java多執行併發鎖和原子操作真的瞭解

前言                 對於Java多執行緒,接觸最多的莫過於使用synchronized,這個簡單易懂,但是這synchronized並非效能最優的。今天我就簡單介紹一下幾種鎖。可能我下面講的時候其實很多東西不會特別深刻,最好的方式是自己做實驗,把各種場景在

【小家java】Java中的執行真的用對了?(教用正確的姿勢使用執行池)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

Java中執行真的會用

轉載自   Java中執行緒池,你真的會用嗎 在《深入原始碼分析Java執行緒池的實現原理》這篇文章中,我們介紹過了Java中執行緒池的常見用法以及基本原理。 在文中有這樣一段描述: 可以通過Executors靜態工廠構建執行緒池,但一般不建議這樣使用。 關於這個

秒懂執行執行安全只需5步!

在探討執行緒安全之前,我們先來聊聊什麼是程序。 什麼是程序? 電腦中時會有很多單獨執行的程式,每個程式有一個獨立的程序,而程序之間是相互獨立存在的。比如下圖中的QQ、酷狗播放器、電腦管家等等。 什麼是執行緒? 程序想要執行任務就需要依賴執行緒。換句話說,就是程

Java中執行真的會用

  我騎著小毛驢,喝著大紅牛哇,哩個啷格里格朗,別問我為什麼這木開心,如果活著不是為了浪蕩那將毫無意義      今天來捋一捋我們平日經常用的instanceof和typeof的一些小問題      typeof:      typeof裡面是由一個小坑的  我們今天著重來研

【面試】如果這樣回答“什麼是執行安全面試官都會對刮目相看

有讀者跟我說,喜歡看我的文章,說很容易讀,我確實在易讀性上花費的心思不亞於在內容上。因為我不喜歡一上來就堆很多東西,而且把簡單的東西搞得複雜人人都會,但是把複雜的東西講的簡單,確實需要非常多的思考。不是執行緒的安全面試官問:“什麼是執行緒安全”,如果你不能很好的回答,那就請往下看吧。論

Java併發程式設計之set集合的執行安全知道

Java併發程式設計之-set集合的執行緒安全類 Java中set集合怎麼保證執行緒安全,這種方式你知道嗎? 在Java中set集合是 本篇是《凱哥(凱哥Java:kagejava)併發程式設計學習》系列之《併發集合系列》教程的第二篇: 本文主要內容:Set集合子類底層分別是什麼?基於底層為什麼set的子類可

阿里雲優惠活動及優惠券的領取真的瞭解

最近阿里雲確實搞了不少活動,比如優惠碼、優惠券等,其中最比較實在的莫過於返1888元禮包了 領取最高1888元阿里雲通用代金券禮包,雲產品優惠不止100+款(點選領取)   注意以下規則: 1、活動期間,同一使用者每天限領取1次。 2、阿里雲伺服器,阿里雲郵箱代金

Android 許可權機制真的瞭解

一、Android的許可權機制 Android是目前最流行的智慧手機軟體平臺之一,在智慧移動終端如火如荼發展的同時,其安全態勢也日益嚴峻。有調查表明,惡意軟體的數量在持續的上升,Google在Android安全機制上面也做了很多工作,並且一直在持續的更新,其Android的

關於Java中的時間處理真的瞭解

之前在我的知識星球的直面Java板塊中,給粉絲們出了這樣一道題: 在Java中,如何獲取不同時區的當前時間? 你知道這道題的正確答案應該如何回答嗎?背後的原理又是什麼呢? 然後,緊接著,我又提出了以下問題: 為什麼以下程式碼無法得到美國時間。(在東八區的計算機上) System.

Java執行執行安全開啟多執行及每執行迴圈10次對類進行輸出測試

最近看到執行緒問題,emmm~腦闊回想到計算機作業系統貌似又講,不過上課睡覺覺去啦哈哈哈,java課老師莫得講~ 然歸正傳,今對執行緒進行查閱及測試,做一下筆記,有錯之處還請指出,謝謝~上程式碼之前呢先說一哈前傳 執行緒是程序中的最小執行單位:    手機呢會有很多單獨

TCP三次握手原理真的瞭解

最近碰到一個問題,Client 端連線伺服器總是拋異常。在反覆定位分析、並查閱各種資料搞懂後,我發現並沒有文章能把這兩個佇列以及怎麼觀察他們的指標說清楚。 問題描述 場景:Java 的 Client 和 Server,使用 Socket 通訊。Server 使用 NIO。 問題: 間歇性出現 Clien

Android:四大架構的優缺點真的瞭解

前言 前不久剛結束對 20 模組專案的第 3 輪重構,一路見證 MVC、MVP、Clean 的優缺點並形成自己的體會。 近期在總結工作經驗的同時,開始寫部落格。順便開源了我設計的 ViaBus 架構。 專案常用架構比對 以下,對常見的 MVC、MVP、Clean、AAC 架構做個比對。 首先,一張表格展示

java多執行2:區域性變數的執行安全實列變數的非執行安全

java多執行緒2:區域性變數的執行緒安全,實列變數的非執行緒安全 “非執行緒安全“就是在多個執行緒訪問同一個物件的例項變數進行併發訪問時候發生,產生的後果就是”髒讀“,也就是取到的資料其實是被修改過的。 a.多執行緒訪問區域性變數是執行緒安全的。 package multiThread

和程式設計師打交道的十大禁忌瞭解

原文:http://www.aqee.net/post/interacting-with-geeks.html#comment-28215 如果你正在讀這篇文章,那麼非常有可能是有人發給你了這條連結。這個人可能是你的朋友,同事,親戚,父母,兒子,

java中最常見的幾種執行時異常get了

NullPointerException  (空指標異常) ClassCastException  (型別強制轉換異常) NumberFormatException  (數字格式異常) NegativeArraySizeException  (陣列大小為負數異常) SecurityException 

對於Ping的過程真的瞭解

一、概覽 對於ping命令,想必只要是程式設計師都知道吧?當我們檢查網路情況的時候,最先使用的命令肯定是ping命令吧?一般我們用ping檢視網路情況,主要是檢查兩個指標,第一個是看看是不是超時,第二個看看是不是延遲太高。如果超時那麼肯定是網路有問題啦(禁ping情況除外),如果延遲太高,

【本人禿頂程式設計師】和程式設計師打交道的十大禁忌瞭解

←←←←←←←←←←←← 我都禿頂了,還不點關注! 如果你正在讀這篇文章,那麼非常有可能是有人發給你了這條連結。這個人可能是你的朋友,同事,親戚,父母,兒子,兄弟,表親,姑嫂,外甥,或者恰巧幫你解決了電腦問題的一個人。他通常是程式設計師,系統管理員,或者 “擅長電腦”名聲在外的某個人。