1. 程式人生 > >Synchronized和Lock的區別

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。