[multithreading] Semaphore vs. Monitors - what's the difference?