在 Threading 程序中使用锁定机制是否等同于同步而不是异步执行代码?

Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?

下面的示例代码使用了锁定的概念。但这会阻止它进行并行执行。那么问题的标题是否正确: 在 Threading 程序中使用锁定机制是否等同于同步而不是异步执行代码?

同样的情况是否适用于 Threading.Monitor 并使用 [同步] 属性声明 class??

static void Main(string[] args) 
{    
    Console.WriteLine("*****Synchronizing Threads *****\n");  
    Printer p = new Printer();  
    // Make 10 threads that are all pointing to the same    
    // method on the same object.    
    Thread[] threads = new Thread[10]; 
    for (int i = 0; i < 10; i++)    
    {      
        threads[i] = new Thread(new ThreadStart(p.PrintNumbers));  
        threads[i].Name = string.Format("Worker thread #{0}", i);    
    }  
    // Now start each one.   
    foreach (Thread t in threads)  
    t.Start();   
    Console.ReadLine();
} 

public void PrintNumbers() 
{   
    // Use the private object lock token.  
    lock (threadLock)  
    {    
        // Display Thread info.
        Console.WriteLine("-> {0} is executing PrintNumbers()",Thread.CurrentThread.Name);  
        // Print out numbers.    
        Console.Write("Your numbers: "); 
        for (int i = 0; i < 10; i++)  
        {      
            Random r = new Random();   
            Thread.Sleep(1000 * r.Next(5));  
            Console.Write("{0}, ", i);    
        }     
        Console.WriteLine();  
    }
}

Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?

特别是在您的示例中,您用锁包装了整个方法调用,因此您将体验到同步行为,在这种情况下线程将毫无用处,并且提供的开销大于收益。

很多时候,在访问共享状态时,您有一个特定的地方需要锁定,而这通常是并行度的限制所在。但是,如果您有大量可以并行执行的 CPU 工作,您仍然可以获得计算优势。

附带说明一下,异步和并行是有区别的。我建议您阅读 this article 以详细了解两者的含义。

Is using locking mechanism in Threading program equivalent to executing the code synchronously rather then asynchronously?

它结合了同步程序缺乏并发性和多线程的开销,以结合这两种方法的较差部分。

这只是为了证明锁定会强制同步访问特定的代码位。在真正的多线程使用中,一个人持有锁的时间尽可能短,因此不同的线程可以同时工作,只有在绝对必要时才会相互阻塞。