Monitor או lock מאפשרים לנו לסנכרן בין Threadים שונים באותו תהליך.
יש לשים לב שתמיד עדיף לא לעשות lock על this. כי כך אנחנו מאבדים שליטה על הביצוע של הקוד ויכולים בקלות להגיע למצב של deadlock. בגלל זה נשתמש במה שנקרא SyncRoot pattern. שזה אומר שמגדירים משתנה סטטי או רגיל במחלקה אבל חסוי ורק עליו מבצעים את ה lock.
Mutex וגם Semaphore הם שתי מחלקות שיורשות מ WaitHandle ומאפשרים לנו לסנכרן גם בין תהליכים שונים.
למשל אם נרצה שתהליך כלשהו לא יכול להיות מופעל פעמיים על ידי המשתמש. כדי לקבל שליטה על ה Mutex נפעיל את הפונקציה WaitOne או כמה הרחבות שלה.