1蕉斜、Lock是java的一個(gè)interface接口,而synchronized是Java中的關(guān)鍵字,synchronized是由JDK實(shí)現(xiàn)的捶闸,不需要程序員編寫(xiě)代碼去控制加鎖和釋放鹦筹;Lock的接口如下:
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}
2铝阐、synchronized修飾的代碼在執(zhí)行異常時(shí),jdk會(huì)自動(dòng)釋放線程占有的鎖铐拐,不需要程序員去控制釋放鎖徘键,因此不會(huì)導(dǎo)致死鎖現(xiàn)象發(fā)生;但是遍蟋,當(dāng)Lock發(fā)生異常時(shí)吹害,如果程序沒(méi)有通過(guò)unLock()去釋放鎖,則很可能造成死鎖現(xiàn)象虚青,因此Lock一般都是在finally塊中釋放鎖它呀;格式如下:
Lock lock = new LockImpl; // new 一個(gè)Lock的實(shí)現(xiàn)類
lock.lock(); // 加鎖
try{
//todo
}catch(Exception ex){
// todo
}finally{
lock.unlock(); //釋放鎖
}
3、Lock可以讓等待鎖的線程響應(yīng)中斷處理,如tryLock(long time, TimeUnit unit)纵穿,而synchronized卻不行烟号,使用synchronized時(shí),等待的線程會(huì)一直等待下去政恍,不能夠中斷汪拥,程序員無(wú)法控制;
4篙耗、synchronized是非公平鎖迫筑,Lock可以設(shè)置是否公平鎖,默認(rèn)是非公平鎖宗弯;
5脯燃、Lock的實(shí)現(xiàn)類ReentrantReadWriteLock提供了readLock()和writeLock()用來(lái)獲取讀鎖和寫(xiě)鎖的兩個(gè)方法,這樣多個(gè)線程可以進(jìn)行同時(shí)讀操作蒙保;
6辕棚、Lock鎖的范圍有局限性,僅適用于代碼塊范圍邓厕,而synchronized可以鎖住代碼塊逝嚎、對(duì)象實(shí)例、類详恼;
7补君、Lock可以綁定條件,實(shí)現(xiàn)分組喚醒需要的線程昧互;synchronized要么隨機(jī)喚醒一個(gè)挽铁,要么喚醒全部線程。