多線程之鎖機制

  1. 在java虛擬機環境下,需要對以下兩種線程共享的區域進行加鎖

1.保存在堆裏面的對象
2.保存在方法區裏的類變量
java的鎖機制
實際在jvm中每個對象或者類都會綁定一個監視器相關的鎖,爲了實現監視器的排他性監視功能,分別綁定對象的實例變量和類的實例變量。一個鎖代表每次只能有一個線程進行訪問,一個線程可以對對象多次加鎖控制,對於每個對象,jvm維護一個加鎖計數器,線程每次獲得一個對象就加1,釋放這個對象時就減1,直到加鎖計數器爲0時才真正釋放這個對象的鎖。java編程人員不需要自己動手加鎖,對象鎖是java虛擬機內部使用的。在java程序中,只需要使用synchronized塊或者synchronized方法就可以標誌一個監視區域。當每次進入一個監視區域時,java 虛擬機都會自動鎖上對象或者類。
保證線程安全方式:synchronized和lock鎖

synchronized

注意:
對於同步方法鎖是當前實例對象
對於同步方法塊,鎖是Synchonized**括號裏配置的對象**。
對於靜態同步方法,鎖是當前對象的Class對象

Lock

使用鎖來保證線程安全

區別

首先他們肯定具有相同的功能內存語義

1、與synchronized相比,ReentrantLock提供了更多,更加全面的功能,具備更強的擴展性。例如:時間鎖等候,可中斷鎖等候,鎖投票

2、ReentrantLock還提供了條件Condition,對線程的等待、喚醒操作更加詳細和靈活,所以在多個條件變量和高度競爭鎖的地方,ReentrantLock更加適合(以後會闡述Condition)。

3、ReentrantLock提供了可輪詢的鎖請求。它會嘗試着去獲取鎖,如果成功則繼續,否則可以等到下次運行時處理,而synchronized則一旦進入鎖請求要麼成功要麼阻塞,所以相比synchronized而言,ReentrantLock會不容易產生死鎖些。

4、ReentrantLock支持更加靈活的同步代碼塊,但是使用synchronized時,只能在同一個synchronized塊結構中獲取和釋放。注:ReentrantLock的鎖釋放一定要在finally中處理,否則可能會產生嚴重的後果。

5、ReentrantLock**支持中斷處理**,且性能較synchronized會好些。

發佈了63 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章