JUC(Lock)和Monitor Object(Synchronized)機制區別是什麼
這是一道面試題
- synchronized和lock的用法區別
- synchronized和lock效能區別
- Refer
一、synchronized和lock的用法區別
synchronized:在需要同步的物件中加入此控制,synchronized可以加在方法上,也可以加在特定程式碼塊中,括號中表示需要鎖的物件。
lock:需要顯示指定起始位置和終止位置。一般使用ReentrantLock類做為鎖,多個執行緒中必須要使用一個ReentrantLock類做為物件才能保證鎖的生效。且在加鎖和解鎖處需要通過lock()和unlock()顯示指出。所以一般會在finally塊中寫unlock()以防死鎖。
ReentrantLock 擁有Synchronized相同的併發性和記憶體語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候
執行緒A和B都要獲取物件O的鎖定,假設A獲取了物件O鎖,B將等待A釋放對O的鎖定,
如果使用 synchronized ,如果A不釋放,B將一直等下去,不能被中斷
如果 使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時間以後,中斷等待,而幹別的事情
ReentrantLock獲取鎖定與三種方式:
a) lock(), 如果獲取了鎖立即返回,如果別的執行緒持有鎖,當前執行緒則一直處於休眠狀態,直到獲取鎖。
b) tryLock(), 如果獲取了鎖立即返回true,如果別的執行緒正持有鎖,立即返回false。
c)tryLock(long timeout,TimeUnit unit), 如果獲取了鎖定立即返回true,如果別的執行緒正持有鎖,會等待引數給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false。
d) lockInterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當前執行緒處於休眠狀態,直到獲得鎖定,或者當前執行緒被別的執行緒中斷。
二、synchronized和lock效能區別
1、synchronized原語和ReentrantLock在一般情況下沒有什麼區別,但是在非常複雜的同步應用中,請考慮使用ReentrantLock,特別是遇到下面2種需求的時候。
- 某個執行緒在等待一個鎖的控制權的這段時間需要中斷
- 需要分開處理一些wait-notify,ReentrantLock裡面的Condition應用,能夠控制notify哪個執行緒
- 具有公平鎖功能,每個到來的執行緒都將排隊等候
2、synchronized是在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在程式碼執行時出現異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過程式碼實現的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}中
3、在資源競爭不是很激烈的情況下,Synchronized的效能要優於ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的效能會下降幾十倍,但是ReetrantLock的效能能維持常態;
synchronized:
在資源競爭不是很激烈的情況下,偶爾會有同步的情形下,synchronized是很合適的。原因在於,編譯程式通常會盡可能的進行優化synchronize,另外可讀性非常好,不管用沒用過5.0多執行緒包的程式設計師都能理解。
ReentrantLock:
ReentrantLock提供了多樣化的同步,比如有時間限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在資源競爭不激烈的情形下,效能稍微比synchronized差點點。但是當同步非常激烈的時候,synchronized的效能一下子能下降好幾十倍。而ReentrantLock確還能維持常態。
Atomic:
和上面的類似,不激烈情況下,效能比synchronized略遜,而激烈的時候,也能維持常態。激烈的時候,Atomic的效能會優於ReentrantLock一倍左右。但是其有一個缺點,就是隻能同步一個值,一段程式碼中只能出現一個Atomic的變數,多於一個同步無效。因為他不能在多個Atomic之間同步。
所以,我們寫同步的時候,優先考慮synchronized,如果有特殊需要,再進一步優化。ReentrantLock和Atomic如果用的不好,不僅不能提高效能,還可能帶來災難。
Refer
相關推薦
JUC(Lock)和Monitor Object(Synchronized)機制區別是什麼
這是一道面試題 synchronized和lock的用法區別 synchronized和lock效能區別 Refer 一、synchronized和lock的用法區別 synchronized:在需要同步的物件中加入此控制,synchronize
java併發程式設計(三)--java中的鎖(Lock介面和佇列同步器AQS)
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { //內部類--節點 static final clas
【Java併發程式設計】之二十:併發新特性—Lock鎖和條件變數(含程式碼)
簡單使用Lock鎖 Java 5中引入了新的鎖機制——java.util.concurrent.locks中的顯式的互斥鎖:Lock介面,它提供了比synchronized更加廣泛的鎖定操作。Lock介面有3個實現它的類:ReentrantLock、Reetrant
關於延遲載入(lazy)和強制載入(Hibernate.initialize(Object proxy) )
PO 即Persistence Object VO 即Value Object PO 和VO 是Hibernate 中兩個比較關鍵的概念。 首先,何謂VO,很簡單,VO 就是一個簡單的值物件。 如: TUser user = new TUser(); user.setNam
抽象類(abstract class)和接口(interface)有什麽異同?
否則 繼承 默認 strong 什麽 成員 -s 實例 abstract 相同點: 1.抽象類和接口都不能被實例化,但可以定義抽象類和接口類型的引用。 2.一個類如果繼承了抽象類和接口,必須要對其中的抽象方法全部實現。(接口中方法默認的是public abstract修飾的
同步(Synchronous)和異步(Asynchronous)
就會 一個 方法調用 這一 開始 訂單 必須 通知 下單 同步和異步通常用來形容一次方法調用。同步方法調用一旦開始,調用者必須等到方法調用返回後,才能繼續後續的行為。異步方法調用更像一個消息的傳遞,一旦開始,方法調用就會立即返回,調用者就可以繼續後續的操作。而異步方法通常會
java String長度與varchar長度匹配理解(字符和字節長度理解)
轉化 筆記 指定 是我 有一個 ati 法語 itl 情況 java String長度與varchar長度匹配理解(字符和字節長度理解) string中的length()長度,返回的是char的數量,每個char可以存儲世界上任何類型的文字和字符,一個char 而
C語言中存儲類別又分為四類:自動(auto)、靜態(static)、寄存器的(register)和外部的(extern)。
字符變量 修飾 例如 register ext 進行 適合 sta -- 除法運算中註意: 如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2;而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000。 取余運算中註意: 該運算只適
SpringMVC中文件的上傳(上傳到服務器)和下載問題(二)--------下載
cat exc stream log trac close pri page fin 一、建立一個簡單的jsp頁面。 我們在建好的jsp的頁面中加入一個超鏈接:<a href="${pageContext.request.contextPath}/down
maven可選依賴(Optional Dependencies)和依賴排除(Dependency Exclusions)
許可 mave manage spa 兩個 傳遞 方式 mis ont 我們知道,maven的依賴關系是有傳遞性的。如:A-->B,B-->C。但有時候,項目A可能不是必需依賴C,因此需要在項目A中排除對A的依賴。在maven的依賴管理中,有兩種方式可以對依賴關
LeetCode 380. Insert Delete GetRandom O(1) (插入刪除和獲得隨機數 常數時間)
delet size 利用 eat www. random called ret runtime Design a data structure that supports all following operations in average O(1) time.
Java 自增(++) 和 C語言中自增的區別
%d 區別 但是 [] .cn cnblogs 微軟雅黑 自增 華麗 在Java、c語言等高級語言中自增和自減的作用基本一致,都是變量自身加一或減一。下面我只對自增進行說明,自減是類似的。 自增運算符(++),有兩種書寫形式,一個是在變量前: ++ num; 另一種
UI自動化測試(二)瀏覽器操作及對元素的定位方法(xpath定位和css定位詳解)
cli 刷新 ota api enter 版本 ror apache 窗口 Selenium下的Webdriver工具支持FireFox(geckodriver)、 IE(InternetExplorerDriver)、Chrome(ChromeDriver)、 Opera
Linux運維之道之admin1.4(權限和歸屬,LADP認證)
達內 linux 運維admin admin1.4權限和歸屬:基本權限:基本權限的類別:訪問方式(權限):---讀取:允許查看內容--read (r權限:能夠ls瀏覽此目錄內容)---寫入:允許修改內容--write (w權限:能夠執行rm/mv/cp/mkdir/touch等更
轉發(forward)和重定向(redirect)的區別
border 新的 狀態 rec nbsp url req red 完成 轉發與重定向的主要區別 轉發 重定向 轉發是服務器行為 重定向是客戶端行為 轉發瀏覽器url不改變 重定向瀏覽器url改變 轉發request請求數據不丟失 重定向request請
發個無聊時寫的俄羅斯方塊(分為SDL和Qt兩個版本)
app deb fcm cnn 無聊 線程 dac tutorial spi 6213-ChineseZodiac(map) 多線程問題 【CF472G】【XSY2112】DesignTutorial壓位 大家都開始C++0x了,我也來湊熱鬧,今天的主題是《調侃rvalue
淺談淺克隆(shallow clone)和 深克隆(deep clone)
turn ont row 控制臺 cep test 寫入 main supported 區別就在於是否對對象中的引用變量所指向的對象進行拷貝。 1.淺克隆/淺復制/淺拷貝 淺拷貝是指在拷貝對象時,對於基本數據類型的變量會重新復制一份,而對於引用類型的變量只是對引用進行拷
微服務架構 SpringCloud(二)Eureka(服務註冊和服務發現基礎篇)
col false -c conf gis 功能 pri desc sch 一:Eureka簡介 Eureka是Spring Cloud Netflix的一個子模塊,也是核心模塊之一。用於雲端服務發現,一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移
表單提交(同步提交)和AJAX提交(異步提交)
接收 為我 spa 提交 method 提交按鈕 技術 分享 可能 表單提交(同步提交) HTML文件: PHP文件: 這樣就能接收到HTML裏輸入的內容,註意: FORM表頭method為POST,PHP文件獲取的方法就是$_POST,method為GET,PH
Linux後臺進程管理以及ctrl+z(掛起)、ctrl+c(中斷)、ctrl+(退出)和ctrl+d(EOF)的區別(轉)
列表 art 信息 csdn 而是 png detail tps 後臺 一、後臺進程管理命令 fg、bg、jobs、&、ctrl + z、ctrl + c、ctrl + \、ctrl + d1、 &加在一個命令的最後,可以把這個命令放到後臺執行 ,如fire