讀寫鎖的形式如下
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.拖動乙個按鈕到...