阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

前言

衆所周知,在Java的知識體系中,併發編程是非常重要的一環,也是面試的必問題,一個好的Java程序員是必須對併發編程這塊有所瞭解的。

然而不論是哪個國家,什麼背景的 Java 開發者,都對自己寫的併發程序相當自信,但也會在出問題時表現得很詫異甚至一籌莫展。

可見,Java 併發編程顯然不是一件能速成的能力,基礎打得越好,越全面,在實踐中纔會有更深刻的理解。

因此,大家不難發現 Java 併發問題一直是各個大廠面試的重點之一。我在平時的面試中,也發現很多候選人對一些基本的併發概念表示沒聽過,或原理不理解,可能知道一些卻又講不清楚,最終導致面試失敗。

本文會結合實際中接觸到的一些面試題,重點來聊一聊 Java 併發中的相關知識點。

Synchronized 相關問題

問題一:Synchronized 用過嗎,其原理是什麼?

問題二:你剛纔提到獲取對象的鎖,這個“鎖”到底是什麼?如何確定對象的鎖?

問題三:什麼是可重入性,爲什麼說 Synchronized 是可重入鎖?

問題四:JVM 對 Java 的原生鎖做了哪些優化?

問題五:爲什麼說 Synchronized 是非公平鎖?

問題六:什麼是鎖消除和鎖粗化?

問題七:爲什麼說 Synchronized 是一個悲觀鎖?樂觀鎖的實現原理又是什麼?什麼是

問題八:樂觀鎖一定就是好的嗎?

可重入鎖 ReentrantLock 及其他顯式鎖相關問題

問題一:跟 Synchronized 相比,可重入鎖 ReentrantLock 其實現原理有什麼不同?

問題二:那麼請談談 AQS 框架是怎麼回事兒?

問題三:請儘可能詳盡地對比下 Synchronized 和 ReentrantLock 的異同。

問題四:ReentrantLock 是如何實現可重入性的?

問題五:除了 ReetrantLock,你還接觸過 JUC 中的哪些併發工具?

問題六:請談談 ReadWriteLock 和 StampedLock。

問題七:如何讓 Java 的線程彼此同步?你瞭解過哪些同步器?請分別介紹下。

問題八:CyclicBarrier 和 CountDownLatch 看起來很相似,請對比下呢?

Java 線程池相關問題

問題一:Java 中的線程池是如何實現的?

問題二:創建線程池的幾個核心構造參數?

問題三:線程池中的線程是怎麼創建的?是一開始就隨着線程池的啓動創建好的嗎?

問題四:既然提到可以通過配置不同參數創建出不同的線程池,那麼 Java 中默認實現好的線程池又有哪些呢?請比較它們的異同。

問題五:如何在 Java 線程池中提交線程?

Java 內存模型相關問題

問題一:什麼是 Java 的內存模型,Java 中各個線程是怎麼彼此看到對方的變量的?

問題二:請談談 volatile 有什麼特點,爲什麼它能保證變量對所有線程的可見性?

問題三:既然 volatile 能夠保證線程間的變量可見性,是不是就意味着基於 volatile 變量的運算就是併發安全的?

問題四:請對比下 volatile 對比 Synchronized 的異同。

問題五:請談談 ThreadLocal 是怎麼解決併發安全的?

問題六:很多人都說要慎用 ThreadLocal,談談你的理解,使用 ThreadLocal 需要注意些什麼?

如何學習併發編程

學習java併發就像進入了另外一個學習領域,就像學習一門新的編程語言,或者是學習一套新的語言概念,要理解併發編程,其難度跟理解面向對象編程難度差不多。你花一點功夫,就可以理解它的基本機制,但是要想真正掌握它的本質,就需要深入的學習與理解。最後在分享一個併發編程知識的學習導圖給大家!

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?


2019版多線程與高併發(馬士兵)

各位同學,大家好,這是首次使用比較口語化的文字形成-本書,其實也不知道效果如何,希望各位收到書本後能夠多提意見和建議。同時也請大家體諒,由於時間關係和忙碌程度,暫時只能總結成爲口語化的形式,後面時間充裕了,將會以書面語言的方式進行重新更新。

第一節:線程的基本概念

首先給大家交代- -下我們2019年這個版本給大家講哪些內容,這個版本主要集中在多線程和高併發這兩大塊,這兩大塊兒是現在面試問的越來越多,也是相對-一個初級的程序員向中高級邁進的必須要踏過的一-個坎兒。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第二節: volatile與CAS

volatile

我們先來看這個volatile的概念,volatile它是什麼意思。現在像大的互聯網企業的面試,基本上volatile是必會的,有時候他也不會太問,認爲你應該會,但是中小企業也就開始問這方面的問題。

我們來看一下這個小程序,寫了-一個方法啊,首先定義了-個變布爾類型等於true ,這裏模擬的是一個服務器的操作,我的值爲true你就給我不間斷的運行,什麼時候爲false你再停止。測試new Thread啓動-個線程,調用m方法,睡了-秒,最後running等於false ,運行方法他是不會停止的。如果你要把volatile打開,那麼結果就是啓動程序-秒之後他就會m end停止。( volatile就是不停的追蹤這個值,時刻看什麼時候發生了變化)

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第三節: Atomic類和線程同步新機制

今天,我們繼續講-個Atomic的問題 ,然後開始講除synchronized之外的別的鎖。在前面內容我們講了synchronized. volatile. Atomic和CAS , Atomic我們只是講了-個開頭還沒有講完,今天我們繼續。

像原來我們寫m++你得加鎖,在多線程訪問的情況下,那現在我們可以用Atomicinteger了,它內部就已經幫我們實現了原子操作。直接寫count. incrementAndGet(: /count1++這個就相當於count++.原來我們對count是需要加鎖的, 現在就不需要加鎖了。

我們看下面小程序,模擬,我們計一個數,所有的線程都要共同訪問這個數count值,大家知道如果所有線程都要訪問這個數的時候,如果每個線程給它往上加了10000 ,你這個時候是需要加鎖的,不加鎖會出問題。但是,你把它改成AtomicInteger之後就不用在做加鎖的操作了,因爲incrementAndGet內部用了cas操作,直接無鎖的操作往上遞增,有同學可能會講爲什麼要用無鎖操作啊,原因是無鎖的操作效率會更高。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第四節: LockSupport、淘寶面試題與源碼閱讀方法論

首先我們簡單回顧一下前面三節課講的內容 ,分別有線程的基本概念、synchronized. volatile.AtomicXXX、各種JUC同步框架(ReentrantLock. CountDownLatch. CyclicBarrier, Phaser.ReadWriteLock- StampedLock. Semaphore. Exchanger. LockSupport) ,其中synchornized重點講了-下,包括有synchor nized的底層實現原理、鎖升級的概念(四種狀態:無鎖、偏向鎖、輕量級鎖重量級鎖) , volatile我們講了可見性和禁止指令重排序如何實現。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第五節: AQS源碼閱讀與強軟弱虛4種引用以及ThreadLocal原理與源碼

今天咱們繼續講AQS的源碼,在上節課我教大家怎麼閱讀AQS源碼。跑不起來的不讀。解決問題就好一目的性。- -條線索到底、無關細節略過,讀源碼的時候應該先讀骨架,比如拿AQS來說,你需要了解AQS是這麼一一個數據結構,你讀源碼的時候讀起來就會好很多, 在這裏需要插-句,從第一章到本章,章章的內容都是環環相扣的,沒學習前邊,建議先去補習- -下前面的章節。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第六節:併發容器

今天是第六天了,這節課本來想上-個大而全的課,後來發現這個實在目標太大了,大而全的概念就是上節課講到的那張容器圖中的每一個都講的非常的細緻,然後去談他們的源碼。但是如果這麼講的話我們高井發的課就講不完了,所以也彆着急,後面單獨開門課來講集合,集合的發展歷程,現在爲什麼講這個併發容器呢,主要是爲了線程池做準備,線程池裏有一個參數就是用併發容器來做你工作任務的容器。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第七節:線程池

今天這節課呢,我們通過- -道面試把前面講的哪些基礎複習一下,然後再開始線程池這部分的內容,我們一點一點來看。

這道面試題呢實際上是華爲的一-道面試題,其實它裏面是一道填空題 ,後來就很多的開始考這道題,這個面試題是兩個線程,第一個線程是從1到26 ,第二個線程是從A到- -直到Z ,然後要讓這兩個線程做到同時運行,交替輸出,順序打印。那麼這道題目的解法有非常多。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第八節:線程池與源碼閱讀

第一個我們講了一個Executor這個接口,大家回顧-下這個接口是幹什麼使的,把線程的定義和執行分開,主要來做線程的執行接口。在這他下面有一個整個的這 個線程池的生命週期,它裏面的方法都給他定義全的接口ExecutorService ,他下面還有AbstractExecutor這個沒有和大家說,這個無所謂了,是爲了哪些個子類做準備的。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?


阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

第九節: JMH與Disruptor

今天我們講兩個內容,第一個是IMH ,第二個是Disruptor.這兩個內容是給大家做更進一步的這種多線程和高併發的一些專業上的處理。生產環境之中我們很可能不自己定義消息隊列,而是使用Disruptor.我們生產環境做測試的時候也不是像我說的那樣寫一個start寫一 個end就測試完了。 在這裏給大家先介紹專業的MH測試工具,在給大家介紹Disruptor號稱最快的消息隊列。

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?


阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

因文件資料過多就不給大家一一展示了

阿里巴巴高併發架構到底多牛逼?是如何抗住淘寶雙11億級併發量?

結語

最後我把這些實際遇到的併發編程面試題及常見問題的答案總結了一下,由於文字過多,就單獨做了一個文檔。以及準備了一些更多關於Kafka、Mysql、Tomcat、Docker、Spring、MyBatis、Nginx、Netty、Dubbo、Redis、Netty、Spring cloud、分佈式、高併發、性能調優、微服務等架構面試題和架構資料免費分享,如有需要的朋友的可以來免費領取,同時可以轉發下和關注,以後還會分享更多幹貨的!

掃碼領書

二維碼.jpg


推薦閱讀:

不懂算法怎麼去字節等大廠面試?左程雲大神聯合馬士兵大佬120分鐘帶你掌握算法底層

bilibili.com/video/BV1A

馬士兵親授:一小時搞定線程泄露問題,深入JDK源碼解讀ThreadLocal的私有領地

bilibili.com/video/BV1o

阿里P9架構師120分鐘帶你掌握線程池,不在爲線程而煩惱

bilibili.com/video/BV1G


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章