郑州建筑公司网站建设,互联网企业推广,万能素材库视频,百度手机端排名lock 关键字将语句块标记为临界区#xff0c;方法是获取给定对象的互斥锁#xff0c;执行语句#xff0c;然后释放该锁。此语句的形式如下#xff1a; 以带有颜色区分的格式查看复制到剪贴板打印Object thisLock new Object();
lock (thisLock)
{// Critical code section… lock 关键字将语句块标记为临界区方法是获取给定对象的互斥锁执行语句然后释放该锁。此语句的形式如下 以带有颜色区分的格式查看复制到剪贴板打印 Object thisLock new Object();
lock (thisLock)
{// Critical code section.}Object thisLock new Object();
lock (thisLock)
{// Critical code section.} 备注 lock 关键字可确保当一个线程位于代码的临界区时另一个线程不会进入该临界区。如果其他线程尝试进入锁定的代码则它将一直等待即被阻止直到该对象被释放。 线程处理C# 和 Visual Basic 这节讨论了线程处理。 lock 关键字在块的开始处调用 Enter而在块的结尾处调用 Exit。 通常应避免锁定 public 类型否则实例将超出代码的控制范围。 常见的结构 lock (this)、 lock (typeof (MyType)) 和 lock (myLock) 违反此准则 如果实例可以被公共访问将出现 lock (this) 问题。 如果 MyType 可以被公共访问将出现 lock (typeof (MyType)) 问题。 由于进程中使用同一字符串的任何其他代码都将共享同一个锁所以出现 lock(“myLock”) 问题。 最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。 示例 下面演示在 C# 中使用未锁定的线程的简单示例。 //using System.Threading;class ThreadTest{public void RunMe(){Console.WriteLine(RunMe called);}static void Main(){ThreadTest b new ThreadTest();Thread t new Thread(b.RunMe);t.Start();}}// Output: RunMe called //using System.Threading;class ThreadTest{public void RunMe(){Console.WriteLine(RunMe called);}static void Main(){ThreadTest b new ThreadTest();Thread t new Thread(b.RunMe);t.Start();}}// Output: RunMe called 下例使用线程和 lock。 只要 lock 语句存在语句块就是临界区并且 balance 永远不会是负数。 // using System.Threading;class Account{private Object thisLock new Object();int balance;Random r new Random();public Account(int initial){balance initial;}int Withdraw(int amount){// This condition will never be true unless the lock statement// is commented out:if (balance 0){throw new Exception(Negative Balance);}// Comment out the next line to see the effect of leaving out // the lock keyword:lock (thisLock){if (balance amount){Console.WriteLine(Balance before Withdrawal : balance);Console.WriteLine(Amount to Withdraw : - amount);balance balance - amount;Console.WriteLine(Balance after Withdrawal : balance);return amount;}else{return 0; // transaction rejected}}}public void DoTransactions(){for (int i 0; i 100; i){Withdraw(r.Next(1, 100));}}}class Test{static void Main(){Thread[] threads new Thread[10];Account acc new Account(1000);for (int i 0; i 10; i){Thread t new Thread(new ThreadStart(acc.DoTransactions));threads[i] t;}for (int i 0; i 10; i){threads[i].Start();}}} 转载于:https://www.cnblogs.com/kingangWang/archive/2011/12/05/2276815.html