1、互斥同步(阻塞式倍阐、悲觀鎖)
可以簡(jiǎn)單理解為兩個(gè)人上洗手間概疆,一個(gè)人進(jìn)去后要先上鎖,出來后釋放鎖收捣,后面的人才能進(jìn)届案。
(1)synchronized塊
這個(gè)是原生語法層面的互斥鎖庵楷,默認(rèn)是非公平鎖
(2)ReentrantLock
這個(gè)是api層面的互斥鎖罢艾。與synchronized相比,有以下幾個(gè)新的特性:
1)等待可中斷尽纽。ReentrantLock可以在等待一段時(shí)間獲取不到鎖的情況下咐蚯,放棄等待,改為處理其他事情弄贿。
2)公平鎖春锋。ReentrantLock默認(rèn)是非公平鎖,可以在構(gòu)造器中傳入用公平鎖差凹。延伸閱讀:公平鎖與非公平鎖的對(duì)比
3)ReentrantLock可以綁定多個(gè)條件期奔。
jdk1.6以前synchronized效率比ReentrantLock低侧馅,jdk1.6及以后的版本兩者性能基本上持平。
2呐萌、非阻塞同步(樂觀鎖)
阻塞式和非阻塞的區(qū)別在于:阻塞式讓等待的線程blocked住馁痴,而非阻塞式則不會(huì)讓線程出于阻塞狀態(tài)。CAS是實(shí)現(xiàn)非阻塞的關(guān)鍵肺孤。
具體可參考java.util.concurrent.atomic 相關(guān)類罗晕。
3、無同步方案
(1)程序員編寫可重入代碼
意思是代碼本身不會(huì)帶來同步問題赠堵,無需做同步處理小渊。
(2)線程本地存儲(chǔ)
ThreadLocal類,將需要在線程內(nèi)部共享的數(shù)據(jù)放到這里面茫叭。
4酬屉、虛擬機(jī)提供的鎖優(yōu)化機(jī)制
jdk1.6以后,HostSpot虛擬機(jī)提供了一些鎖優(yōu)化技術(shù)揍愁,是為了提高在線程同步的情況下盡量避免線程的阻塞梆惯,因?yàn)樽枞麜?huì)帶來性能的消耗。
(1)自旋鎖
-XX:+UseSpining吗垮,jdk1.6以后默認(rèn)開啟
意思是后到的線程不直接進(jìn)入阻塞態(tài)垛吗,而是執(zhí)行一個(gè)短時(shí)間的空循環(huán),看鎖是否會(huì)很快釋放烁登。但不可無限循環(huán)下去怯屉,如果超過了一定次數(shù),則選擇進(jìn)入阻塞狀態(tài)
設(shè)置自旋的次數(shù):-XX:PreBlockSpin
(2)自適應(yīng)自旋鎖
如果對(duì)于某個(gè)鎖饵沧,自旋很少成功過锨络,以后就選擇不進(jìn)行自旋了。
(3)鎖消除
對(duì)于一些代碼上要求同步狼牺,但被監(jiān)測(cè)到不可能存在共享數(shù)據(jù)競(jìng)爭(zhēng)的鎖進(jìn)行消除羡儿。
(4)鎖粗化
如果虛擬機(jī)探測(cè)到很短的時(shí)間內(nèi)線程要多次對(duì)一個(gè)對(duì)象進(jìn)行加解鎖,為了避免性能消耗是钥,會(huì)將加鎖的范圍擴(kuò)大掠归,只需要一次加解鎖。
總結(jié)自《深入理解java虛擬機(jī)》13.2.2悄泥,延伸了一下