讀寫鎖的使用以及降級優化

2021-10-05 13:05:44 字數 3612 閱讀 6674

讀寫鎖的形式如下

readwritelock readwritelock =

newreentrantreadwritelock()

; lock readlock = readwritelock.

readlock()

; lock writelock = readwritelock.

writelock()

;

1.讀讀共享

volatile integer a =0;

public

void

test1()

catch

(interruptedexception e)

finally

}public

void

test2()

catch

(interruptedexception e)

finally

}public

static

void

main

(string[

] args)).

start()

;new

thread((

)->).

start()

;}

test1方法和test2方法都不釋放鎖的情況下,如果互斥那麼a值只會列印一次

結果:0

0證明獲取讀鎖的執行緒,可以同時執行不互斥

2.讀寫互斥

volatile integer a =0;

public

void

test1()

catch

(interruptedexception e)

finally

}public

void

test2()

finally

}public

static

void

main

(string[

] args)

throws interruptedexception ).

start()

;//讓test1方法先執行

timeunit.seconds.

sleep(2

);newthread((

)->).

start()

;}

test1方法先執行 也就是獲取讀鎖線程先執行,看獲取寫鎖的是否能執行成功。

結果:0

只會列印一次說明讀寫互斥

3.寫寫互斥

volatile integer a =0;

public

void

test1()

catch

(interruptedexception e)

finally

}public

void

test2()

finally

}public

static

void

main

(string[

] args)

throws interruptedexception ).

start()

;//讓test1方法先執行

timeunit.seconds.

sleep(2

);newthread((

)->).

start()

;}

**與讀寫互斥差不多把test1換成寫鎖

結果:0

只會列印一次說明寫寫互斥

讀寫互斥:讀的時候 其他執行緒不能寫。如果讀取的過程不涉及對共享狀態的修改推薦用readlock,即保證讀取的過程中,狀態量在其他執行緒中不會部分更新,導致讀執行緒讀取資料異常,同時也保證了讀執行緒之間不會出現競爭消耗。

讀讀共享:減少鎖競爭的優化手段

寫寫互斥:對狀態量修改的過程中,其他執行緒不可以寫,也不可以讀

比如:對乙個鍊錶新增乙個元素,然後更新size。這個操作執行時,如果剛新增乙個元素,還沒有更新size值就被其他執行緒讀到了,那麼就出現size和鍊錶長度不匹配的問題。如果新增過程中,其他執行緒也在新增修改,那麼size++這種操作就會出現問題。

總結:在讀多寫少環境下,用readlock效率更高

readwritelock readwritelock =

newreentrantreadwritelock()

; lock readlock = readwritelock.

readlock()

; lock writelock = readwritelock.

writelock()

;volatile integer c;

countdownlatch countdownlatch =

newcountdownlatch(1

);public

void

test1()

finally

//1和2兩個步驟就是鎖降級的過程

tryfinally

}public

void

test2()

}catch

(exception e)

}public

static

void

main

(string[

] args)

throws interruptedexception ).

start()

;//讓test1方法先執行

timeunit.seconds.

sleep(2

);newthread((

)->).

start()

;}

一般情況下讀操作配讀鎖,寫操作配寫鎖。

在寫操作的情況下,如果寫完之後 不去使用了可以直接釋放寫鎖

如果寫完之後,還要繼續使用這些狀態(狀態量可能有多個),如果直接釋放寫鎖,導致其他執行緒修改了這些狀態,那麼之後的操作感知不到其他執行緒的修改,(比如:

writelock.lock();

user user=new user();

map.put(「user1」,user);

writelock.unlock();

string username=user.getusername(); //此時還一直使用以前的值感知不到其他執行緒的修改)

所以此時加上乙個讀鎖

writelock.lock();

user user=new user();

map.put(「user1」,user);

//降級

readlock.lock();

writelock.unlock();

string username=user.getusername(); //此時其他加鎖執行緒可以讀到map中的user,但是不能去修改。所以此時得到的username依然是正確的,而且在讀多寫少的情況下回大幅降低鎖競爭帶來的消耗

readlock.unlock();

Hive語言的使用,以及效能優化

hive出現的原因 解決從乙個現有的資料基礎架構轉移到hadoop上,hive適合資料倉儲應用程式的,可以維護海量資料,而且可以對資料進行挖掘,形成報告。查詢hadoop集群中的資料 1 hive的查詢語言,用來查詢hadoop中的資料,hive是將大多數的查詢轉換為mapreduce任務 2 hi...

結構體使用以及函式優化

通過學習高博一起做rgbdslam系列,體會到乙個工程專案由簡單到複雜的過程,列出自己認為重要的地方 1.將一些相關的變數封裝到結構體中,歸類之後一是方便觀察,二是處理起來很有條理 2.將寫好,不經常改動的函式寫到新的檔案中,通過鏈結庫以及包含標頭檔案來實現呼叫函式 3.專案要引用到的引數,可以專門...

CMFCColorButton的使用以及重繪

cmfccolorbutton是visual studio 2008 sp1版本以上提供的顏色採集器。系統環境 windows 7 程式設計環境 visual studio 2008 sp1 下面介紹下使用步驟 1.新建基於對話方塊的工程,名稱為mycolorbuttondemo 2.拖動乙個按鈕到...