1. 程式人生 > >ReentrantLock和synchronized關鍵字有什麼區別

ReentrantLock和synchronized關鍵字有什麼區別

其實它們的區別很簡單,簡單的說,就是synchronized由於是底層JVM實現的互斥,因此效率會高一些。而ReentrantLock的功能則比synchronized更多,比如定時獲取某個鎖,多個等待條件等。

java在編寫多執行緒程式時,為了保證執行緒安全,需要對資料同步,經常用到兩種同步方式就是Synchronized和重入鎖ReentrantLock。

相似點:

       這兩種同步方式有很多相似之處,它們都是加鎖方式同步,而且都是阻塞式的同步,也就是說當如果一個執行緒獲得了物件鎖,進入了同步塊,其他訪問該同步塊的執行緒都必須阻塞在同步塊外面等待,而進行執行緒阻塞和喚醒的代價是比較高的(作業系統需要在使用者態與核心態之間來回切換,代價很高,不過可以通過對鎖優化進行改善)。

區別:

      這兩種方式最大區別就是對於Synchronized來說,它是java語言的關鍵字,是原生語法層面的互斥,需要jvm實現。而ReentrantLock它是JDK 1.5之後提供的API層面的互斥鎖,需要lock()和unlock()方法配合try/finally語句塊來完成。

1.Synchronized

    Synchronized進過編譯,會在同步塊的前後分別形成monitorenter和monitorexit這個兩個位元組碼指令。在執行monitorenter指令時,首先要嘗試獲取物件鎖。如果這個物件沒被鎖定,或者當前執行緒已經擁有了那個物件鎖,把鎖的計算器加1,相應的,在執行monitorexit指令時會將鎖計算器就減1,當計算器為0時,鎖就被釋放了。如果獲取物件鎖失敗,那當前執行緒就要阻塞,直到物件鎖被另一個執行緒釋放為止。

  1. publicclass SynDemo{  
  2.     publicstaticvoid main(String[] arg){  
  3.         Runnable t1=new MyThread();  
  4.         new Thread(t1,"t1").start();  
  5.         new Thread(t1,"t2").start();  
  6.     }  
  7. }  
  8. class MyThread implements Runnable {  
  9.     @Override
  10.     publicvoid run() {  
  11.         synchronized (this) {  
  12.             for
    (int i=0;i<10;i++)  
  13.                 System.out.println(Thread.currentThread().getName()+":"+i);  
  14.         }  
  15.     }  
  16. }  
檢視位元組碼指令:

2.ReentrantLock

   由於ReentrantLock是java.util.concurrent包下提供的一套互斥鎖,相比Synchronized,ReentrantLock類提供了一些高階功能,主要有以下3項:

        1.等待可中斷,持有鎖的執行緒長期不釋放的時候,正在等待的執行緒可以選擇放棄等待,這相當於Synchronized來說可以避免出現死鎖的情況。

        2.公平鎖,多個執行緒等待同一個鎖時,必須按照申請鎖的時間順序獲得鎖,Synchronized鎖非公平鎖,ReentrantLock預設的建構函式是建立的非公平鎖,可以通過引數true設為公平鎖,但公平鎖表現的效能不是很好。

        3.鎖繫結多個條件,一個ReentrantLock物件可以同時繫結對個物件。

ReentrantLock的用法如下:

  1. publicclass SynDemo{  
  2.     publicstaticvoid main(String[] arg){  
  3.         Runnable t1=new MyThread();  
  4.         new Thread(t1,"t1").start();  
  5.         new Thread(t1,"t2").start();  
  6.     }  
  7. }  
  8. class MyThread implements Runnable {  
  9.     private Lock lock=new ReentrantLock();  
  10.     publicvoid run() {  
  11.             lock.lock();  
  12.             try{  
  13.                 for(int i=0;i<5;i++)  
  14.                     System.out.println(Thread.currentThread().getName()+":"+i);  
  15.             }finally{  
  16.                 lock.unlock();  
  17.             }  
  18.     }  

相關推薦

ReentrantLocksynchronized關鍵字什麼區別

其實它們的區別很簡單,簡單的說,就是synchronized由於是底層JVM實現的互斥,因此效率會高一些。而ReentrantLock的功能則比synchronized更多,比如定時獲取某個鎖,多個等

面試官:你說說ReentrantLockSynchronized區別

大家好!又和大家見面了。為了避免面試尷尬,今天同比較通俗語言和大家聊下ReentrantLock和Synchronized區別!   使用方式 Synchronized可以修飾例項方法,靜態方法,程式碼塊。自動釋放鎖。 ReentrantLock一般需要try catch finally語句,在t

創建線程synchronized關鍵字

去重 等待 父類 art 實現 extend inner 所有 ner 很長時間沒有更新博客,恰好這段時間工作上需要使用線程,就稍微花點時間再次復習(學習)了一下線程知識。在此文中我將圍繞以下幾點對線程進行講解: 1.線程的創建(thread,runnable) 2.S

Java中的ReentrantLocksynchronized兩種鎖定機制的對比

優化 實現 維護 pla 所有 投票 明顯 拋出異常 數據 多線程和並發性並不是什麽新內容,但是 Java 語言設計中的創新之一就是,它是第一個直接把跨平臺線程模型和正規的內存模型集成到語言中的主流語言。核心類庫包含一個 Thread 類,可以用它來構建、啟動和操縱線程,J

數據庫中inexists關鍵字區別

查詢 功能 body member sel 子查詢 ber rom func 數據庫中in和exists關鍵字的區別 in 是把外表和內表作hash join,而exists是對外表作loop,每次loop再對內表進行查詢。 一直以來認為exists比in效

PHP static關鍵字self關鍵字區別

訪問方式 進行 source strac 說明 屬性 php extend xtend 在PHP的一個類中,帶有static關鍵字的方法和屬性被稱為靜態方法和靜態屬性,這樣的方法和屬性可以通過類直接訪問,而不需要通過類對應的實例來進行訪問,在類中訪問靜態變量以及靜態屬性的時

ReenTrantLockSynchronized

相同點: 都是可重入鎖,都是同一個執行緒沒進入一次,鎖的計數器自增1,等到鎖的計數器為0時釋放鎖。 不同點: 1、Synchronized依賴jvm實現,實現方式比較難見到,ReetTrantLock依賴JDK實現,有原始碼可看。 2、Synchronized使用簡單便捷,加鎖,解鎖

異常throw throws關鍵字區別

最近根據自己的一些見解,異常throw 和throws主要區別如下: throw        用於丟擲異常物件;throw用在函式內(執行throw則明確丟擲了某種異常),後面跟的是異常物件,可封裝一些提示資訊,將異常物件傳遞到呼

C#:abstarct virtual關鍵字區別分析,new 與 override關鍵字區別分析

1.首先 absratct 和 virtual 都是與繼承概念有關係。 2.區別 ① virtual 關鍵字用於在父類中修飾方法,該方法在父類中可提供實現,並且子類中使用此方法有兩種方式。 方式1: 在父類中定義了virtual方法,在子類中沒有用ov

Java中thissuper關鍵字區別

this強調的是物件的本身,通過this呼叫的屬性和方法都是它所屬於的那個類中的屬性和方法。屬於物件和類間的關係 super在子類中呼叫父類的方法和屬性。屬於子類和父類兩個類間的關係 //父類

super關鍵字,super關鍵字this關鍵字區別

super關鍵字: 使用super可以呼叫父類的成分:父類的成員變數、父類的方法、父類的構造方法。 注意:使用super關鍵字和this關鍵字,均不能用在靜態方法中,只能用在普通方法(例項方法)中。訪

volatilesynchronized關鍵字

++ i++ 區別 .get style src 的區別 內部 需要 synchronized java課上講到過synchronized 首先看看用synchronized和沒用synchronized的區別 import lombok.Getter; /** *

java中break關鍵字continue關鍵字區別

1.break關鍵字 break 主要用在迴圈語句或者 switch 語句中,用來跳出整個語句塊。 break 跳出最裡層的迴圈,並且繼續執行該迴圈下面的語句。 public class Test

執行緒-synchronized方法同步塊的作用範圍;synchronized(this)synchronized(obj)的區別

原文:http://m.blog.csdn.net/blog/u010802573/38661719 參考資源: http://www.cnblogs.com/oracleDBA/archive/2010/05/22/1741642.html http://www

Thread.join()synchronized關鍵字的解釋

time () 進入 else exc main 需要 ted 如果 理解了好長時間哇。。。 1 public final synchronized void join(long millis) 2 throws InterruptedExcep

weakassign關鍵字什麼不同

首先說說在什麼情況下使用 weak 關鍵字 1、ARC中,在有可能出現迴圈引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate 的代理屬性。 2、自身已經對它有過一次強引用,所以沒有必要再強引用一次。這個時候也會使用weak;還有就是自定義IBO

ReentrantLockSynchronized對比

ReentrantLock 類實現了 Lock,擁有Synchronized相同的併發性和記憶體語義,此外還多了鎖投票,定時鎖等候和中斷鎖等候,在激烈爭用情況下效能更好 Lock 和 synchronized 有一點明顯的區別 —— lock 必須在 finally 塊中

Lock介面與Synchronized關鍵字區別

首先,Lock介面與Synchronized關鍵字都能提供相同的同步功能,只是Lock介面在使用時,需要顯示地獲取和釋放鎖。從而使Lock介面沒有像Synchronized關鍵字那樣隱式獲取鎖來的便捷

this super 關鍵字區別

屬性的區別:this訪問本類中的屬性,如果本類沒有此屬性則從父類中繼續查詢。super訪問父類中的屬性。 方法的區別:this訪問本類中的方法,如果本類沒有此方法則從父類中繼續查詢。super訪問父類中的方法。 構造的區別:this呼叫本類構造,必須放在構造

String常量池synchronized關鍵字

在java中String是一個比較特殊的類,String有一個自己的常量池,存放了初始化的字串,這一個特性經常能導致一些坑,下面簡單的介紹一點。 一,用常量賦值的字串 String a=”abc”; 當執行這條語句時,先在常量池中查詢是否有”abc”物件,如果有