public ReaderWriter()
{
Join j = Join.Create();
j.Initialize(out Idle);
j.Initialize(out Sharing);
j.Initialize(out Shared);
j.Initialize(out ReleaseShared);
j.Initialize(out Exclusive);
j.Initialize(out ReleaseExclusive);
j.When(Shared).And(Idle).Do(delegate{ Sharing(1);});
j.When(Shared).And(Sharing).Do(delegate(int sharing){
Sharing(sharing+1);});
j.When(ReleaseShared).And(Sharing).Do(delegate(int sharing){
if (sharing==1) Idle(); else Sharing(sharing-1);});
j.When(Exclusive).And(Idle).Do(delegate{});
j.When(ReleaseExclusive).Do(delegate{ Idle();});
Idle();
}