Improving the speed of Thread interrupt checking
Jeroen Frijters
jeroen at sumatra.nl
Sat May 11 00:49:54 PDT 2013
Charles Oliver Nutter wrote:
> You need CAS because one form of the interrupt check clears it and
> another does not. So the get + check + set of interrupt status needs to
> be atomic, or another thread could jump in and change it during that
> process.
I believe Thread.interrupted() and Thread.isInterrupted() can both be implemented without a lock or CAS.
Here are correct implementations:
private volatile boolean interruptPending;
public boolean isInterrupted() {
return interruptPending;
}
public static boolean interrupted() {
Thread current = currentThread();
if (!current.interruptPending) {
return false;
}
current.interruptPending = false;
return true;
}
Any interrupts that happen before we clear the flag are duplicates that we can ignore and any that happen after are new ones that will be returned by a subsequent call. The key insight is that the interruptPending flag can be set by any thread, but it can only be cleared by the thread it applies to.
Regards,
Jeroen
More information about the mlvm-dev
mailing list