using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading ; namespace 多线程 { class 线程元子性 { private static Person per = new Person() ; public static void Main() { for( int i = 0 ; i < 10 ; i ++ ) { new Thread( PersonThread).Start() ; } Thread.Sleep( 1000 ) ; Console.WriteLine( per.Age ) ; Console.ReadLine() ; } public static void PersonThread() { for( int i = 0 ; i < 5000 ; i ++ ) { //本来在Age 属性中我们已经使用了LOCK,但是即便如此,也会出现竞态问题 //原因就是在+=中是先get然后再set,线程仍有可能取到临时值 //所以,在调用处加lock,然后在get set中去掉 //lock( per ) //{ // per.Age += 1 ; //} //当然,我们也可以通过给Person提供一个安全线程的递增方法 per.IncrementAge() ; } } } class Person { private int _age ; private object sync = new object() ; public int Age { get { //lock( sync ) // { return this._age ; // } } //set //{ // //lock( sync ) // // { // this._age = value ; // // } //} } public int IncrementAge() { lock( sync ) { return ++ this._age ; } } } }