關於同步和鎖(不斷更新,get倒啥就先記上)

2021-09-01 12:58:23 字數 1189 閱讀 2305

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...