Ways of creating multi-threaded applications in .NET (Part 4). Methods of thread synchronization