我想使用原子變量在Java中實現互斥體。我嘗試使用lamport麪包店算法來實現它,並且它可以工作。但我不知道如何實現它,如果我不知道以前的線程數。使用原子變量在Java中實現互斥體
此外,lamport算法不斷增加標籤,並將有溢出,如何避免這種情況?
我想使用原子變量在Java中實現互斥體。我嘗試使用lamport麪包店算法來實現它,並且它可以工作。但我不知道如何實現它,如果我不知道以前的線程數。使用原子變量在Java中實現互斥體
此外,lamport算法不斷增加標籤,並將有溢出,如何避免這種情況?
您想構建一個或使用現有的信號量。
創建一個簡單的TTAS(試驗,測試和集)自旋鎖是相當簡單:
class TTASLock {
private final AtomicLong thread = new AtomicLong();
void lock() {
while (true) {
if (thread.get() == 0) { // test
if (thread.compareAndSet(0, Thread.currentThread().getId())) // testAndSet
return;
}
}
}
void unlock() {
thread.compareAndSet(Thread.currentThread().getId(), 0)
}
}
這是一個非常簡單的自旋鎖。測試,測試和設置範例並非嚴格需要邏輯pov,但是是一個關鍵的性能改進,因此在競爭中,等待鎖定獲取的線程不會持續使失敗CAS操作的Level2緩存行失效。
這只是一個練習? Java有[內置併發](http://download.oracle.com/javase/tutorial/essential/concurrency/index.html)用於生產代碼。 –
@Matt Ball:我喜歡不回答這個問題的評論。 (可以改寫爲*「從什麼時候起,SO成爲一個可以質疑問題而不是回答問題的地方?」)* – SyntaxT3rr0r
他的評論可以很容易地被解析爲「你可能會通過實現它來解決這個錯誤的方式你自己,這取決於你的目標是什麼,如果你所追求的是一個實現,那麼Java在這個標準庫中就包含了這種類型的功能「。 – RHSeeger