Werfen Sie einen Blick auf die Lock
Schnittstelle und ihre Implementierung ReentrantLock
. Es ermöglicht Ihnen tryLock()
Verfahren, einschließlich der Variante zu verwenden, die für einige Zeit warten können, wenn die Ressource bereits gesperrt ist:
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, leider hat keine java.util.concurrency
Paket und ich denke, die beste Wahl, die Sie haben, ist zu implementieren, um die gleiche Logik mittels synchronized
und Doppelprüfungen:
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;
}
}
}
es wird nicht so schnell wie ReentrantLock
arbeitet, die CAS-Schleife durch den Prozessor Anweisungen in der modernen JVMs unterstützt verwendet, aber es wird die Arbeit erledigen.
Diese Implementierung ist ebenfalls nicht reentrant, Sie können sie erweitern, um den Sperr-Thread zu verfolgen und die Anzahl der Sperren, wenn Sie einen Wiedereintritt benötigen.
Wichtiges Update: @Stephen C machte einen guten Punkt, dass double check is broken in Java 1.4 und man muss immer daran denken. Aber es gibt Ausnahmen. Zum Beispiel kurze primitive Typen. Also, ich denke, es wird in diesem speziellen Fall funktionieren. Weitere Details finden Sie unter "Double-Checked Locking is Broken" Declaration.
Hallo, während [dies] (http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html) möglicherweise Ihre Frage nicht beantworten kann, glauben Sie, dass es in Ihrem Fall immer noch relevant ist (JDK 1.4), es sei denn, Sie haben dies bereits als Teil Ihrer Implementierung betrachtet. –
Wenn ein Thread in Ihrem Programm kann so lange einen Mutex belegt, dass andere Threads können nicht darauf warten leisten, dann ist das ein Algorithmus, der neu gestaltet werden weint aus. –