//結點入隊,必要的時候需要初始化
private node enq
(final node node)
else}}
}
/**
* 當前執行緒或給定模式的結點入隊
*/private node addwaiter
(node mode)
}//結點入隊,具體看上面
enq(node)
;//返回入隊的結點
return node;
}
/**
* 喚醒後繼(如果存在的話)
*/private
void
unparksuccessor
(node node)
if(s != null)
//喚醒執行緒
locksupport.
unpark
(s.thread)
;}
/**
* 設定頭結點並且後繼引用可直接獲取鎖
*/private
void
setheadandpropagate
(node node,
int propagate)
}
/**
* 取消正在嘗試獲取鎖的執行緒
*/private
void
cancelacquire
(node node)
else
else
node.next = node;
// help gc
}}
/**
* 字面直接翻譯下:
* 檢查並更新無法獲取的節點的狀態。如果執行緒應該阻塞,則返回true。
* 這是所有採集迴路中的主要訊號控制。要求 pred == node.prev
* * 簡單說下:判斷是否可以掛起當前執行緒
* @param pred 前繼結點的狀態
* @param node 結點
* @return 如果執行緒阻塞返回 true,反之 false
*/private
static
boolean
shouldparkafte***iledacquire
(node pred, node node)
while
(pred.waitstatus >0)
; pred.next = node;
}else
return
false
;}
/**
* 自我中斷(嚇死爹了,是個狠角色)
*/static
void
selfinterrupt()
/**
* 阻塞當前執行緒並檢查執行緒是否中斷
*/private
final
boolean
parkandcheckinterrupt()
/**
* 以 獨佔 不中斷模式獲取鎖
* 用於 獲取 和條件等待佇列方法 中
*/final
boolean
acquirequeued
(final node node,
int arg)if(
shouldparkafte***iledacquire
(p, node)
&&parkandcheckinterrupt()
)//判斷是否可以掛起並且當前執行緒阻塞
interrupted =
true;}
}finally
}
/**
* 可中斷的方式獲取鎖
* 大部分**和上面 acquirequeued 方法類似,所以只在不一樣的地方加注釋
*/private
void
doacquireinterruptibly
(int arg)
throws interruptedexception
// 執行緒被喚醒後如果發現中斷請求就丟擲異常if(
shouldparkafte***iledacquire
(p, node)
&&parkandcheckinterrupt()
)throw
newinterruptedexception()
;}}finally
}
/**
* 以限定超時時間模式獲取鎖
* 大部分**和上面 acquirequeued 方法類似,所以只在不一樣的地方加注釋
*/private
boolean
doacquirenanos
(int arg,
long nanostimeout)
throws interruptedexception
//看時間是否到了,超時時間到了就返回
nanostimeout = deadline - system.
nanotime()
;if(nanostimeout <=0)
//判斷是否可以掛起
//超時時間大於自旋時間;spinfortimeoutthreshold:自旋超時閾值,預設 1000if(
shouldparkafte***iledacquire
(p, node)
&& nanostimeout > spinfortimeoutthreshold)
//在獲取鎖的期間收到中斷請求就丟擲異常
if(thread.
interrupted()
)throw
newinterruptedexception()
;}}finally
}
/**
* 以 共享 不中斷模式獲取鎖
* 注意和 acquirequeued 的區別
* 上面有的注釋就不在寫了,原諒我偷會懶,(*^▽^*)
*/private
void
doacquireshared
(int arg)}if
(shouldparkafte***iledacquire
(p, node)
&&parkandcheckinterrupt()
) interrupted =
true;}
}finally
}
//釋放鎖
public
final
boolean
release
(int arg)
return
true;}
return
false;}
/** * 以共享的模式釋放鎖
*/private
void
doreleaseshared()
//若頭結點的轉態是 0 ,則設定狀態為 後繼引用 可直接獲取鎖
else
if(ws ==0&&
!compareandsetwaitstatus
(h,0
, node.propagate)
)continue;}
if(h == head)
//結束迴圈
break;}
}
還有一些方法沒有列出,大部分都能在上面注釋中找到對應的解釋。 九 2 方法的使用 二
一 掌握有引數無返回值方法的呼叫 1 有時方法的執行需要依賴某些條件,就像生活中我們做一件事情時,也許需要前提條件,而方法的引數就需要前提條件,下圖示例為帶引數沒有返回值的方法 呼叫帶參方法與呼叫無參方法的語法類似,但在呼叫時必須傳入實際的引數值。2 不能忽視的問題 2.1 呼叫帶參方法時,必須保證...
Ruby學習筆記2(方法 塊 模組)
ruby中的方法就是其他語言中的函式,名稱應以小寫開頭,以免被解釋為常量。引數可有可無,可以有預設值也可以沒有。每個方法都有預設的返回值,就是最後乙個語句的值。def test a1 ruby a2 perl puts 程式語言為 puts 程式語言為 endtest c c test要傳入數量可變...
011 方法(函式)
方法 找乙個人幫我們做事,解決 冗餘問題,將一堆 進行重用的一種機制。函式 就是一段 這段 可能有輸入值 引數 返回值。格式 訪問修飾符 static 返回值型別 方法名 引數列表 方法名 pascal命名法 引數 camel命名法 找乙個人幫你做事,有條件,有結果 return 返回方法的結果 立...