【尚硅谷】大廠必備技術(shù)之JUC并發(fā)編程



管程(monitor)是保證了同一時刻只有一個進(jìn)程在管程內(nèi)活動,即管程內(nèi)定義的操作在同一時刻只被一個進(jìn)程調(diào)用(由編譯器實現(xiàn)).但是這樣并不能保證進(jìn)程以設(shè)計的順序執(zhí)行
JVM 中同步是基于進(jìn)入和退出管程(monitor)對象實現(xiàn)的,每個對象都會有一個管(monitor)對象,管程(monitor)會隨著 java 對象一同創(chuàng)建和銷毀 執(zhí)行線程首先要持有管程對象,然后才能執(zhí)行方法,當(dāng)方法完成之后會釋放管程,方法在執(zhí)行時候會持有管程,其他線程無法再獲取同一個管程
setDamon(true)
?所謂守護(hù)線程,是指在程序運行的時候在后臺提供一種通用服務(wù)的線程,比如垃圾回收線程就是一個很稱職的守護(hù)者,并且這種線程并不屬于程序中不可或缺的部分。因此,當(dāng)所有的非守護(hù)線程結(jié)束時,程序也就終止了,同時會殺死進(jìn)程中的所有守護(hù)線程。反過來說,只要任何非守護(hù)線程還在運行,程序就不會終止。

·原子性:其實之前詩過很多次了,就怎要做什么事情菠么做完,要么就不做,不存在做一半的情況。
·可見性:指當(dāng)多個線程訪問同一個變帚時,一個線程修改了這個變量的值,其他線程能夠立即看得到格改的值,
·有序性:即程序抗行的順序按照代碼的先后順序執(zhí)行,


虛假喚醒




多個condition 可以定制通信

公平鎖:多個線程按照申請鎖的順序去獲得鎖,線程會直接進(jìn)入隊列去排隊,永遠(yuǎn)都是隊列的第一位才能得到鎖。
非公平鎖:多個線程去獲取鎖的時候,會直接去嘗試獲取,獲取不到,再去進(jìn)入等待隊列,如果能獲取到,就直接獲取到鎖。

Abstract Queued Synchronize 抽象同步隊列

嘗試枷鎖 沒有所過

如果是自己的重復(fù)枷鎖




找一個類,既和Runnable有關(guān)系,又和Callable也有關(guān)系
Runnable接口有實現(xiàn)類FutureTask
FutureTask構(gòu)造可以傳遞Callable




悲觀鎖與樂觀鎖


mysql 版本號
CAS 操作中包含三個操作數(shù) —— 需要讀寫的內(nèi)存位置(V)、進(jìn)行比較的預(yù)期原值(A)和擬寫入的新值(B)。
CAS 有效地說明了“?我認(rèn)為位置 V 應(yīng)該包含值 A;如果包含該值,則將 B 放到這個位置;否則,不要更改該位置,只告訴我這個位置現(xiàn)在的值即可。 ”這其實和樂觀鎖的沖突檢查+數(shù)據(jù)更新的原理是一樣的。
讀寫鎖的優(yōu)點:
- 提高并發(fā)性能:讀寫鎖允許多個線程同時進(jìn)行讀操作,從而提高了多線程環(huán)境下讀操作的并發(fā)性能。
- 減少鎖競爭:相比于使用互斥鎖實現(xiàn)并發(fā)控制,讀寫鎖可以減少鎖競爭,因為多個線程可以同時獲取讀鎖,不必相互等待。
- 數(shù)據(jù)完整性:讀寫鎖可以保證在寫操作時具有排他性,防止多個線程同時修改共享數(shù)據(jù)導(dǎo)致數(shù)據(jù)不一致。
讀寫鎖的缺點:
- 寫操作優(yōu)先級高:由于寫操作會破壞共享數(shù)據(jù)的完整性,因此需要等待所有的讀操作完成后才能執(zhí)行寫操作,這可能導(dǎo)致寫操作的等待時間較長。
- 可能出現(xiàn)饑餓:如果寫操作頻繁,可能會導(dǎo)致讀操作一直等待,從而出現(xiàn)饑餓現(xiàn)象,即某些線程被長期阻塞無法執(zhí)行。



