1. 程式人生 > >ReentrantLock和Synchronized對比

ReentrantLock和Synchronized對比

ReentrantLock 類實現了 Lock,擁有Synchronized相同的併發性和記憶體語義,此外還多了鎖投票,定時鎖等候和中斷鎖等候,在激烈爭用情況下效能更好

Lock 和 synchronized 有一點明顯的區別 —— lock 必須在 finally 塊中釋放。否則,如果受保護的程式碼將丟擲異常,鎖就有可能永遠得不到釋放。

用法對比:

package Lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

  public class SynDemo {
	 public static void main(String[] arg){  
	        Runnable t1=new MyThread();  
	        new Thread(t1,"t1").start();  
	        new Thread(t1,"t2").start();  
	    }  
	  
	}  

  /*  使用synchronized */
	/*class MyThread implements Runnable {  
	  
	    @Override  
	    public void run() {  
	        synchronized (this) {  
	            for(int i=0;i<10;i++)  
	                System.out.println(Thread.currentThread().getName()+":"+i);  
	        }  
	          
	    }  */
   	/*使用ReentrantLock*/
	class MyThread implements Runnable {  
	    	  
	        private Lock lock=new ReentrantLock();  
	        public void run() {  
	                lock.lock();  
	                try{  
	                    for(int i=0;i<5;i++)  
	                        System.out.println(Thread.currentThread().getName()+":"+i);  
	                }finally{  
	                    lock.unlock();    //一定要記得釋放鎖
	                }  
        }    
	    
	    
}

reentrantlock的優點

  • 可以新增多個檢控條件, 如果使用synchronized,則只能使用一個. 使用 reentrant locks 可以有多個wait()/notify() 佇列. [譯註:直接多new 幾個ReentrantLock就可以了,不同的場景/條件用不同的ReentrantLock ]
  • 可以控制執行緒得到鎖的順序,也就是有公平鎖(按照進入順序得到資源),也可以不按照順就像.synchronized 一樣.
  • 可以檢視鎖的狀態, 鎖是否被鎖上了.
  • 可以檢視當前有多少執行緒再等待鎖.

reentrantlock的缺點

  • 需要使用import 引入相關的Class
  • 不能忘記在finally 模組釋放鎖,這個看起來比synchronized 醜陋
  • synchronized可以放在方法的定義裡面, 而reentrantlock只能放在塊裡面. 比較起來, synchronized可以減少巢狀