Synchronized和Lock的區別
1、Lock是java的一個interface介面,而synchronized是Java中的關鍵字,synchronized是由JDK實現的,不需要程式設計師編寫程式碼去控制加鎖和釋放;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修飾的程式碼在執行異常時,jdk會自動釋放執行緒佔有的鎖,不需要程式設計師去控制釋放鎖,因此不會導致死鎖現象發生;但是,當Lock發生異常時,如果程式沒有通過unLock()去釋放鎖,則很可能造成死鎖現象,因此Lock一般都是在finally塊中釋放鎖;格式如下:
```
Lock lock = new LockImpl; // new 一個Lock的實現類
lock.lock(); // 加鎖
try{
//todo
}catch(Exception ex){
// todo
}finally{
lock.unlock(); //釋放鎖
}
```
3、Lock可以讓等待鎖的執行緒響應中斷處理,如tryLock(long time, TimeUnit unit),而synchronized卻不行,使用synchronized時,等待的執行緒會一直等待下去,不能夠中斷,程式設計師無法控制;
4、通過Lock可以知道有沒有成功獲取鎖,tryLock()方法返回boolean值,因此可知道是否獲得了鎖,而synchronized卻無法辦到。
5、Lock的實現類ReentrantReadWriteLock提供了readLock()和writeLock()用來獲取讀鎖和寫鎖的兩個方法,這樣多個執行緒可以進行同時讀操作。
總體來講,當併發量較小,資源競爭不激烈時,兩者的效能是差不多的;當大量執行緒同時競爭,資源非常有限時,此時Lock的效能要遠遠優於synchronized。