java線程原理分析 Java并發(fā)線程如何阻塞和喚醒?
Java并發(fā)線程如何阻塞和喚醒?每個(gè)對(duì)象都有兩個(gè)方法wait和notify,以及同步。Java并發(fā)線程的阻塞和喚醒可以分為幾類:1.同步是基于JVM的對(duì)象頭實(shí)現(xiàn)的。當(dāng)多個(gè)線程競(jìng)爭(zhēng)同一個(gè)關(guān)鍵資源時(shí),它們
Java并發(fā)線程如何阻塞和喚醒?
每個(gè)對(duì)象都有兩個(gè)方法wait和notify,以及同步。
Java并發(fā)線程的阻塞和喚醒可以分為幾類:
1.同步是基于JVM的對(duì)象頭實(shí)現(xiàn)的。當(dāng)多個(gè)線程競(jìng)爭(zhēng)同一個(gè)關(guān)鍵資源時(shí),它們會(huì)根據(jù)不同的鎖機(jī)制(旋轉(zhuǎn)鎖、輕/重鎖)進(jìn)行阻塞和喚醒。
2.這里暫時(shí)跳過(guò)了notify/wait、yeild等基本機(jī)制,一般的實(shí)現(xiàn)原理是基于對(duì)象的同步隊(duì)列非常類似于后面的AQS。
3.并發(fā)組件的基本AQS側(cè)重于AQS(AbstractQueuedSynchronizer)。
因?yàn)檫@是jdk外包的基礎(chǔ)(比如Lock、BlockingQueue、CountdownLatch等。).
Aqs基本上是通過(guò)一個(gè)易變的變量狀態(tài)和一個(gè)等待隊(duì)列來(lái)實(shí)現(xiàn)的。在搶鎖時(shí),CAS先修改狀態(tài),失敗后放入等待隊(duì)列,通過(guò)LockSupport掛起線程。
當(dāng)鎖的擁有者釋放鎖時(shí),它會(huì)通過(guò)LockSupport喚醒等待隊(duì)列的后續(xù)節(jié)點(diǎn),讓它再次嘗試搶鎖(CAS修改狀態(tài)),以此類推。
掌握AQS的原理對(duì)理解jdk中的很多并發(fā)組件很有幫助。
()方法:以毫秒為單位,使線程處于阻塞狀態(tài),時(shí)間到了自動(dòng)喚醒。
()和resume()方法:掛起和喚醒線程,suspend e()使線程進(jìn)入阻塞狀態(tài),只有調(diào)用對(duì)應(yīng)的resume e()時(shí),線程才會(huì)進(jìn)入可執(zhí)行狀態(tài)。不建議這樣做,容易出現(xiàn)死鎖。
3.yield()方法:調(diào)用yield()的效果相當(dāng)于調(diào)度器認(rèn)為線程已經(jīng)執(zhí)行了足夠的時(shí)間,可以切換到另一個(gè)線程。
讓 下面我們就來(lái)談?wù)勥@三種??梢匀sdn看看,了解一下其他的。
java的線程安全是什么?誰(shuí)能一言以蔽之?
這真的可以 不要用一句話來(lái)概括。我寫了一篇關(guān)于線程安全的長(zhǎng)文,我提煉了下面這段話,基本夠理解了:
單線程不會(huì)有安全問(wèn)題,多線程編程會(huì)有安全問(wèn)題。根本問(wèn)題在于是否存在關(guān)鍵資源競(jìng)爭(zhēng)資源。如果多線程不會(huì)訪問(wèn)競(jìng)爭(zhēng)資源,就不會(huì)有安全問(wèn)題,否則會(huì)處理。
什么是競(jìng)爭(zhēng)資源,如下所示:
如果它們?cè)L問(wèn)它們上下文的資源,比如kafka消費(fèi)分區(qū)工作線程訪問(wèn)它們各自的存儲(chǔ),它們將不會(huì)互相干擾;
如果在一個(gè)要執(zhí)行的方法中只使用局部變量,它們不會(huì)互相干擾,因?yàn)樗鼈兾挥诟髯缘木€程堆棧中;
如果執(zhí)行的方法使用傳入的變量,即所謂的形參變量,取決于傳入的變量是否是對(duì)象。如果它只是一個(gè)普通的參數(shù),它不 沒(méi)關(guān)系。如果是對(duì)象,要看對(duì)象是不是同一個(gè)引用,不同的引用沒(méi)有關(guān)系。
如果在一個(gè)執(zhí)行的方法中使用了相同的引用,不管它是傳入的還是外部的全局變量,比如log4 的伐木工,唐 不要擔(dān)心,因?yàn)閘og4已經(jīng)完成了線程安全的編寫。
如果在執(zhí)行的方法中使用了相同的引用:
I)但只是讀而不寫,讀與讀之間沒(méi)有,也不 沒(méi)關(guān)系。
Ii)有所有的寫,但是寫不依賴于讀,也就是說(shuō),線程可以直接寫到覆蓋,而不需要獲得 "最新 "數(shù)據(jù),這種情況無(wú)關(guān)緊要;
Iii)兩者都是寫的,寫的時(shí)候要看最新的資料,所以需要處理;