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 ;
}
}
}
}