Java中的鎖,常見(jiàn)的有悲觀鎖和內(nèi)置鎖。它們都是用于保證并發(fā)情況下數(shù)據(jù)的一致性。
悲觀鎖認(rèn)為在多線程環(huán)境下,數(shù)據(jù)很容易被其他線程修改。所以采用了“先占用再操作”的策略,即對(duì)操作的數(shù)據(jù)加鎖,其他線程想要使用該數(shù)據(jù)時(shí)需要等待當(dāng)前線程釋放鎖。Java中的synchronized關(guān)鍵字就是一種悲觀鎖,它可以修飾方法和代碼塊。如下:
public synchronized void method(){ // synchronized修飾的方法 } public void block(){ synchronized(lock){ // synchronized修飾的代碼塊 } }
內(nèi)置鎖則是Java在語(yǔ)言層面實(shí)現(xiàn)的一種鎖機(jī)制。它基于對(duì)象,就是每個(gè)對(duì)象都有一個(gè)鎖,當(dāng)一個(gè)線程持有該對(duì)象的鎖時(shí),其他線程訪問(wèn)該對(duì)象都需要等待鎖的釋放。Java中的ReentrantLock也是一種內(nèi)置鎖,自行實(shí)現(xiàn)鎖的功能還要通過(guò)lock方法和unlock方法的配合。如下:
ReentrantLock lock = new ReentrantLock(); public void method(){ lock.lock(); try{ // 需要增加鎖保護(hù)的代碼 }finally{ lock.unlock(); } }
總的來(lái)說(shuō),悲觀鎖的實(shí)現(xiàn)比較簡(jiǎn)單,但是性能可能會(huì)下降;而內(nèi)置鎖則比較靈活但是需要手動(dòng)釋放鎖。