博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
“锁定”语句 lock(C# 参考)
阅读量:6691 次
发布时间:2019-06-25

本文共 3320 字,大约阅读时间需要 11 分钟。

  hot3.png

此文章由人工翻译。 将光标移到文章的句子上,以查看原文。

译文

原文

“锁定”语句(C# 参考)

<?XML:NAMESPACE PREFIX = "[default] http://www.w3.org/1999/xhtml" NS = "http://www.w3.org/1999/xhtml" />lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。 下面的示例包含一个lock 语句。

class Account    {        decimal balance;        private Object thisLock = new Object();        public void Withdraw(decimal amount)        {            lock (thisLock)            {                if (amount > balance)                {                    throw new Exception("Insufficient funds");                }                balance -= amount;            }        }    }

有关更多信息,请参见 。

lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

这节讨论了线程处理。

lock 关键字在块的开始处调用 ,而在块的结尾处调用 。 引发,如果 中断等待输入 lock 语句的线程。

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。 常见的结构 lock (this)、lock (typeof (MyType))和 lock ("myLock") 违反此准则:

  • 如果实例可以被公共访问,将出现 lock (this) 问题。

  • 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

  • 由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock("myLock") 问题。

最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

在 lock 语句的正文不能使用 关键字。

下面演示在 C# 中使用未锁定的线程的简单示例。

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

下例使用线程和 lock。 只要 lock 语句存在,语句块就是临界区并且 balance 永远不会是负数。

C#

// 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 never is 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();            }        }    }

有关详细信息,请参阅 。该语言规范是 C# 语法和用法的权威资料。

参考

概念

其他资源

转载于:https://my.oschina.net/wzzz/blog/493950

你可能感兴趣的文章
Python~第一天
查看>>
Linux管理用户账号
查看>>
redis中使用lua脚本
查看>>
颜色数组
查看>>
ELASTICSEARCH清理过期数据
查看>>
oo第三次博客作业
查看>>
设计模式六大原则(转载)
查看>>
Delphi TMemoryStream写入到字符串和字符串写入到流
查看>>
C#判断操作系统是32位还是64位(转)
查看>>
WebADI_配置设定01_设定整合WebADI Integrator(案例)
查看>>
GL_Oracle Erp常用的报表(汇总)
查看>>
使用javacv,解码socket接收的H264码流(byte[]),转为yuv处理,最后再合成转为H264...
查看>>
长春理工大学第十四届程序设计竞赛(重现赛)I
查看>>
corosync+pacemaker部署高可用集群
查看>>
利用Fidder工具抓取App数据包
查看>>
jQuery中 prop 与 attr 方法的区别
查看>>
jsp中遇到Integer的方法valueOf()和parseInt()的区别.前者要求是对象类型,后者是数字型字符串...
查看>>
java实例三维空间求点之间的距离。。。。
查看>>
java中I/O类
查看>>
JDBC(一)
查看>>