Quali sono le differenze tra le varie opzioni di sincronizzazione dei thread in C #?

Qualcuno può spiegare la differenza tra:

  • lock (someobject) {}
  • Utilizzando Mutex
  • Usando il semaforo
  • Utilizzo del monitor
  • Utilizzo di altre classi di sincronizzazione .Net

Non riesco a capirlo. Mi sembra che i primi due siano uguali?