package org.prevayler.foundation;
/**
* Used to sequence operations that have to be performed in order by several concurrent threads.
*/
public class Turn {
private Turn _next;
private int _tickets=0;
private boolean _isAlwaysSkipped;
public static Turn first(){
return new Turn(1000000);
}
private Turn( int tickets){
_tickets=tickets;
}
public Turn next(){
if (_next == null) _next=new Turn(0);
return _next;
}
public synchronized void start(){
if (_tickets == 0) Cool.wait(this);
_tickets--;
}
public void end(){
next().haveSomeTickets(1);
}
private synchronized void haveSomeTickets( int tickets){
if (_isAlwaysSkipped) {
next().haveSomeTickets(tickets);
return;
}
_tickets+=tickets;
notify();
}
public synchronized void alwaysSkip(){
end();
_isAlwaysSkipped=true;
next().haveSomeTickets(_tickets);
}
}