看看Lock
接口及其實現ReentrantLock
。它可以讓你使用tryLock()
方法,包括允許等待一段時間的變種,如果資源已經被鎖定:
private ReentrantLock lock = new ReentrantLock();
public void syncCmd(String controlCmd) {
if (lock.tryLock()) {
try {
// Use your synchronized resource here
} finally {
lock.unlock();
}
} else {
// Failed to lock
}
}
Java 1.4中,不幸的是,沒有java.util.concurrency
包,我覺得你最好的選擇是通過手段和雙重檢查,以實現相同的邏輯:
public class Lock {
private final Object lock = new Object();
private volatile boolean locked = false;
public boolean tryLock() {
if (!locked) {
synchronized (lock) {
if (!locked) {
locked = true;
return true;
}
}
}
return false;
}
public void unlock() {
synchronized (lock) {
locked = false;
}
}
}
它不會工作快ReentrantLock
使用CAS循環在現代JVM處理器指令的支持,但它會做的工作。
此實現也是不可重入的,您可以擴展它以跟蹤鎖定線程並在需要再次進入時鎖定計數。
重要更新: @Stephen C在Java 1.4中提出了一個很好的觀點,即double check is broken,並且總是要牢記這一點。但也有例外。例如,簡單的基本類型。所以,我認爲它會在這個特定的情況下起作用。欲瞭解更多詳情,請查看"Double-Checked Locking is Broken" Declaration。
您好,雖然[this](http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)可能無法回答您的問題,但請相信它仍然與您的情況相關(JDK 1.4 ),除非您已經將其視爲您實施的一部分。 –
如果程序中的任何線程可以佔用互斥鎖的時間太長,以至於其他線程無法等待它,那麼這是一個正在重新設計的算法。 –