Synchronized關(guān)鍵字瓜富、Lock之間的區(qū)別
- ReentrantLock擁有與Synchronized相同的并發(fā)性和內(nèi)存語義,但是其還多了鎖投票鳍咱、定時(shí)鎖等候和中斷鎖等候
例如: 線程A和B都要獲取對(duì)象O的鎖定,假設(shè)A獲取了對(duì)象O鎖与柑,B將等待A釋放對(duì)O的鎖定谤辜,如果使用 synchronized ,如果A不釋放价捧,B將一直等下去丑念,不能被中斷如果 使用ReentrantLock,如果A不釋放结蟋,可以使B在等待了足夠長的時(shí)間以后脯倚,中斷等待,而干別的事情
ReentrantLock獲取鎖定的三種方式:
1. Lock(),如果獲取了鎖立即返回,如果別的線程持有鎖,當(dāng)前線程則一直處于休眠狀態(tài),直到獲取鎖;
2. tryLock(),如果獲取了鎖立即返回true,如果別的線程正持有鎖,立即返回false;
3. tryLock(long timeout,TimeUnit unit),如果獲取了鎖立即返回true,如果別的線程正持有鎖,會(huì)等待給定參數(shù)的時(shí)間,在等待過程中,如果獲取了鎖,就返回true,如果等待超時(shí),返回false;
lockInterruptibly():如果獲取了鎖定立即返回,如果沒有獲取鎖定,當(dāng)前線程處于休眠狀態(tài),直到獲得鎖定,或者當(dāng)前線程被別的線程中斷
synchronized是在JVM層面上實(shí)現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時(shí)出現(xiàn)異常,JVM會(huì)釋放鎖定,但是使用Lock不行,lock是通過代碼實(shí)現(xiàn)的,要保證鎖定一定會(huì)被釋放,就必須將unlock()放到finally{}中
在資源競爭不是很激烈的情況下嵌屎,Synchronized的性能要優(yōu)于ReetrantLock推正,但是在資源競爭很激烈的情況下,Synchronized的性能會(huì)下降幾十倍宝惰,但是ReetrantLock的性能能維持常態(tài)舔稀;
5.0的多線程任務(wù)包對(duì)于同步的性能方面有了很大的改進(jìn),在原有synchronized關(guān)鍵字的基礎(chǔ)上掌测,又增加了ReentrantLock内贮,以及各種Atomic類。了解其性能的優(yōu)劣程度汞斧,有助與我們?cè)谔囟ǖ那樾蜗伦龀稣_的選擇夜郁。
總體的結(jié)論先擺出來:
synchronized:
在資源競爭不是很激烈的情況下,偶爾會(huì)有同步的情形下粘勒,synchronized是很合適的竞端。原因在于,編譯程序通常會(huì)盡可能的進(jìn)行優(yōu)化synchronize庙睡,另外可讀性非常好事富,不管用沒用過5.0多線程包的程序員都能理解技俐。
ReentrantLock:
ReentrantLock提供了多樣化的同步,比如有時(shí)間限制的同步统台,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等雕擂。在資源競爭不激烈的情形下,性能稍微比synchronized差點(diǎn)點(diǎn)贱勃。但是當(dāng)同步非常激烈的時(shí)候井赌,synchronized的性能一下子能下降好幾十倍。而ReentrantLock確還能維持常態(tài)贵扰。
Atomic:
和上面的類似仇穗,不激烈情況下,性能比synchronized略遜戚绕,而激烈的時(shí)候纹坐,也能維持常態(tài)。激烈的時(shí)候舞丛,Atomic的性能會(huì)優(yōu)于ReentrantLock一倍左右恰画。但是其有一個(gè)缺點(diǎn),就是只能同步一個(gè)值瓷马,一段代碼中只能出現(xiàn)一個(gè)Atomic的變量拴还,多于一個(gè)同步無效。因?yàn)樗荒茉诙鄠€(gè)Atomic之間同步欧聘。
因此:
我們寫同步的時(shí)候片林,優(yōu)先考慮synchronized,如果有特殊需要怀骤,再進(jìn)一步優(yōu)化费封。ReentrantLock和Atomic如果用的不好,不僅不能提高性能蒋伦,還可能帶來災(zāi)難弓摘。
ReentrantLock適用場景
1. 某個(gè)線程在等待一個(gè)鎖的控制權(quán)的這段時(shí)間需要中斷;
2. 需要分開處理一些wait-notify,ReentrantLock里面的Condition應(yīng)用,能夠控制notify哪個(gè)線程,鎖可以綁定多個(gè)條件.
3. 具有公平鎖功能,每個(gè)到來的線程都將排隊(duì)等候.