您是否試圖防止來自同一線程或同時訪問多個線程的重新進入?
假設多線程訪問,light方法是使用java.util.concurrent.atomic
。沒有必要像鎖一樣「沉重」(只要沒有進一步的要求)。
假設從相同的方法沒有折返:
private final AtomicBoolean inMethod = new AtomicBoolean();
void method1() {
if (inMethod.compareAndSet(true, false)) { // Alternatively getAndSet
try {
// do Stuff
} finally {
inMethod.set(false); // Need to cover exception case!
}
}
}
如果你想允許同一線程內折返,那麼它得到足夠的亂用鎖:
private final AtomicReference<Thread> inMethod = new AtomicReference<Thread>();
void method1() {
final Thread current = Thread.currentThread();
final Thread old = inMethod.get();
if (
old == current || // We already have it.
inMethod.compareAndSet(null, current) // Acquired it.
) {
try {
// do Stuff
} finally {
inMethod.set(old); // Could optimise for no change.
}
}
}
可以使用爲此執行成語。
這很好。這是通常的做法。 – 2010-11-30 20:07:55
您是否試圖解決一次執行同一方法的多個線程問題,或者該方法(也許間接)調用自身的問題? – 2010-11-30 20:10:10