1、實現原理
首先明確一點同步(syncjronized)和鎖實現的是同樣的功能,執行緒同步,糾結原理,我覺得也是類似的
synchronized(可重入):
以同步**塊為例,反編譯後發現有成對的:
11: monitorenter
58: monitorexit
lock:原始碼應該是通過技術(可重入鎖)
底層應該都是通過作業系統的lock或者原語操作實現的,看過再更正補充。。。todo
重入鎖就是執行緒持有鎖,內部可以再次申請同樣的鎖
2、讀寫鎖
1.執行緒獲得讀鎖條件
沒有其他執行緒已獲得寫鎖,並且沒有其他執行緒需求寫鎖(read access) 此執行緒已獲得讀鎖(read reentrance) 此執行緒已獲得寫鎖(write to read reentrance)
private boolean cangrantreadaccess(thread callingthread)
2.執行緒獲得寫鎖條件
沒有其他執行緒已獲得寫鎖,或者寫鎖(write access) 此執行緒已獲得寫鎖(write reentrance) 此執行緒已獲得讀鎖,且為唯一乙個執行緒獲得讀鎖(read to write reentrance)
private boolean cangrantwriteaccess(thread callingthread)
3.這裡就涉及到了鎖的公升降級問題:
鎖降級:從寫鎖變成讀鎖;鎖公升級:從讀鎖變成寫鎖。讀鎖是可以被多執行緒共享的,寫鎖是單執行緒獨佔的。也就是說寫鎖的併發限制比讀鎖高,這可能就是公升級/降級名稱的**。reentrantreadwritelock不支援鎖公升級
如下**會產生死鎖,因為同乙個執行緒中,在沒有釋放讀鎖的情況下,就去申請寫鎖,這屬於鎖公升級,是不支援的。
如果乙個執行緒持有讀鎖,再申請寫鎖,會造成死鎖(不支援鎖公升級)
如果乙個執行緒持有寫鎖,再申請讀鎖,沒問題(支援鎖降級)
注意:寫鎖降級為讀鎖以後,並不意味著寫鎖釋放,需要手動釋放寫鎖,否則其他執行緒再次申請寫鎖,會造成死鎖
3.執行緒同步
synchronized是通過object的wait、notify
lock是通過condition的await、notify
libuv 不斷更新
initialize the uv async t handle.a null callback is allowed.note that uv async init unlike other libuv functions,immediately starts the handle.to stop...
關於Python學習之我見 不斷更新
一 型別的動態確定 print 3.0 2.0 1.0 5.0 4.0 2.0 1.0 4.0 6.0 輸出的結果是6.75 print 3 2 1 5 4 2 1 4 6 輸出的結果是7 print 3.0 2 1 5 4 2 1 4 6輸出的結果是7.0 print3 2 1 5 4 2 1 4...
gtk函式(不斷更新)
2,gtk widget modify bg用來設定某個構件的背景顏色,類似的函式有gtk widget modify font gtk widget modify text等,分別用來設定構件的不同部分。例項如下 gdkcolor color color.red 27000 color.green...