中核华泰建设有限公司网站,网址和网站的区别,wordpress换ip,linux做商务网站刚刚把前两天的笔记整理完了#xff0c;发现做笔记可以加深印象。要坚持做下去#xff0c;可以学到一些细节的东西。a.今天学到一个非常试用的lock语法:lock(expression) statement_block expression代表你希望跟踪的对象#xff0c;通常是对象引用。一般地#xff0c;如果…刚刚把前两天的笔记整理完了发现做笔记可以加深印象。要坚持做下去可以学到一些细节的东西。a.今天学到一个非常试用的lock 语法: lock(expression) statement_block expression代表你希望跟踪的对象通常是对象引用。一般地如果你想保护一个类的实例你可以使用this如果你希望保护一个静态变量如互斥代码段在一个静态方法内部一般使用类名就可以了。而statement_block就是互斥段的代码这段代码在一个时刻内只可能被一个线程执行。 using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace LockThread{ internal class Account { int balance; Random r new Random(); internal Account(int _initial) { balance _initial; } internal int Withdraw(int _amount) { if(balance 0) { //如果balance0则抛出异常 throw new Exception(Negative Balance); } //下面的代码保证在当前线程修改balance的值完成之前 //不会有其他线程也执行这段代码来修改balance的值 //因此balance的值是不可能小于0的 lock(this) { Console.WriteLine(Current Thread:Thread.CurrentThread.Name); //如果没有lock关键字的保护那么可能在执行完if的条件判断之后 //另外一个线程却执行了balancebalance-amount修改了balance的值 //而这个修改对这个线程是不可见的所以可能导致这时if的条件已经不成立了 //但是这个线程却继续执行balancebalance-amount所以导致balance可能小于0 if(balance _amount) { Thread.Sleep(5); balance balance -_amount; return _amount; } else{ return 0;//处理事务被拒绝 } } } internal void DoTransactions() { for(int i 0;i100; i) Withdraw(r.Next(-50, 100)); } } class Program { static internal Thread[] threads new Thread[10]; static void Main(string[] args) { Account acc new Account(0); for (int i 0; i 10; i) { Thread t new Thread(new ThreadStart(acc.DoTransactions)); t.Name i.ToString(); threads[i] t; } for (int i 0; i 10; i) { threads[i].Start(); } Console.ReadLine(); } }} b.还有一个Moniter对象是用来监视对象的......Queue oQueuenew Queue();......Monitor.Enter(oQueue);......//现在oQueue对象只能被当前线程操纵了Monitor.Exit(oQueue);//释放锁 上面表示oQueue这个对象只有一个线程可以操纵只有当Mointor.Exit才可以被其它线程所操纵转载于:https://www.cnblogs.com/DKSoft/articles/569123.html