java面試題中經(jīng)常會(huì)出現(xiàn)這個(gè)問(wèn)題酒繁,今天查看了網(wǎng)上的詳細(xì)資料滓彰,覺(jué)得值得收藏學(xué)習(xí)_
1、ReentrantLock 擁有Synchronized相同的并發(fā)性和內(nèi)存語(yǔ)義州袒,此外還多了鎖投票揭绑,定時(shí)鎖等候和中斷鎖等候
example:線程A和B都要獲取對(duì)象O的鎖定,假設(shè)A獲取了對(duì)象O鎖郎哭,B將等待A釋放對(duì)O的鎖定他匪,如果使用 synchronized ,如果A不釋放彰居,B將一直等下去诚纸,不能被中斷如果 使用ReentrantLock,如果A不釋放陈惰,可以使B在等待了足夠長(zhǎng)的時(shí)間以后畦徘,中斷等待,而干別的事情
ReentrantLock獲取鎖定與三種方式:
-
lock(), 如果獲取了鎖立即返回抬闯,如果別的線程持有鎖井辆,當(dāng)前線程則一直處于休眠狀態(tài),直到獲取鎖
-
tryLock(), 如果獲取了鎖立即返回true溶握,如果別的線程正持有鎖杯缺,立即返回false;
-
tryLock(long timeout,TimeUnit unit)睡榆, 如果獲取了鎖定立即返回true萍肆,如果別的線程正持有鎖,會(huì)等待參數(shù)給定的時(shí)間胀屿,在等待的過(guò)程中塘揣,如果獲取了鎖定,就返回true宿崭,如果等待超時(shí)亲铡,返回false;
-
lockInterruptibly:如果獲取了鎖定立即返回,如果沒(méi)有獲取鎖定奖蔓,當(dāng)前線程處于休眠狀態(tài)赞草,直到或者鎖定,或者當(dāng)前線程被別的線程中斷