Your code has several race conditions and dead-locks (which explains why GregBrannon got "desired" results and you didn't).

1. You're synchronizing on different objects. Thus every thread is...