#乾貨文:java多執行緒高階教程,這些你都懂了嗎?
一、countdownLatch和cyclicbarrier(這兩個做多執行緒控制很好用,工作中會經常用到)
countdownLatch:主執行緒阻塞,當多個執行緒countdown到0,主執行緒執行;
cyclicbarrier:多個執行緒等待,當都處於等待狀態了一起執行(類似於賽跑機制) 如果有想要學習java的小夥伴,可來我們的java學習扣裙哦:72340,3928裡面贈送java系列教學視訊和資料!小編也是從事了6年java開發的全棧工程師,歡迎初學者和想要進階的同學進來一起學習。 countdownLatch cyclicbarrier
二、volatile和threadlocal
這兩個也要很好掌握,不僅常用,而且面試時候也經常問到!
volatile:使屬性可見性。有個屬性是共享屬性,這個關鍵字會在每個執行緒內開一塊記憶體,每次子執行緒都會從主執行緒拿最新的屬性放到記憶體中。但是有個問題,他只是拿最新的,比如:計數器,每個執行緒都執行+1操作。一個執行緒+1,另外兩個同時讀取這個屬性,那麼不會加2次,而是隻加一次,這就是valatile不能保證原子性的原因。
threadlocal:用於做方法外的全域性屬性。這個跟volatile剛好相反,使全域性變數獨立,每個執行緒裡都有一份獨立副本。 這是hibernate的原始碼,如果當前執行緒沒有session就openSession放到ThreadLocalMap中,每個執行緒的session都是獨立的不會相互受影響。
三、AtomicInteger:支援原子性計數器。
之前說volatile不能作為計數器,那麼多執行緒計數器要用atomic類的AtomicInteger 四、併發類容器
ConCurrentHashMap、CopyAndWriteArrayList、CopyAndWriteArraySet。
ConCurrentHashMap(底層分成16個hashtable來保證併發)讀支援高併發讀,寫和刪除時候只支援16個執行緒,所以一般也要上鎖; copyandwrite支援高併發讀,寫的話要加鎖(原理是,寫的時候賦值一個容器,寫好了把指標指向新容器並且刪除原容器)
map、list、set都有併發類容器。面試時候經常會問hashmap和ConCurrentHashMap區別。這個demo我就不寫了,用法和我們平時用的集合都一樣,只是他們不會造成執行緒不安全。