1.Lock是java中的一個接口祸憋,而synchronized是java中的一個關(guān)鍵字,它是一個內(nèi)置的鎖肖卧,不需要編寫代碼去控制加鎖和釋放蚯窥。而Lock的接口中則提供了加鎖和釋放鎖的一些方法:
void lock();
void lockInterruptibly() throws InterruptedException
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
2.synchronized修飾的代碼在執(zhí)行異常時,jdk會自動釋放線程占有的鎖塞帐,不需要程序員去控制釋放鎖拦赠,因此不會導致死鎖現(xiàn)象發(fā)生;但是葵姥,當Lock發(fā)生異常時矛紫,如果程序沒有通過unlock()去釋放鎖,則很可能造成死鎖現(xiàn)象牌里,因此Lock一般都是在finally塊中釋放鎖
Lock lock = new LockImpl; // new 一個Lock的實現(xiàn)類
lock.lock(); // 加鎖
try{
//todo
}catch(Exception ex){
// todo
}finally{
lock.unlock(); //釋放鎖
}
3、Lock可以讓等待鎖的線程響應(yīng)中斷處理务甥,如使用lockInterruptibly()沒有獲得鎖的線程可以通過interrupt來中斷等待牡辽,而synchronized卻不行,使用synchronized時敞临,等待的線程會一直等待下去态辛,不能夠中斷,程序員無法控制
4.synchronized是非公平鎖挺尿,Lock中的tryLock方法可以設(shè)置是否采用公平鎖奏黑,默認是非公平鎖
- Lock的實現(xiàn)類ReentrantReadWriteLock提供了readLock()和writeLock()用來獲取讀鎖和寫鎖的兩個方法,這樣多個線程可以進行同時讀操作编矾;
6.Lock鎖的范圍有局限性熟史,僅適用于代碼塊范圍,而synchronized可以鎖住代碼塊窄俏、對象實例蹂匹、類;