关于此函数的同步问题,做一个小例子,以备工作参考,注意static 这个关键字的含义,就此例子而言,加与不加都是可以同步成功的,但是对于有些应用,不加是不对的,比如同时只允许一个线程读取的主从问题场景的应用(类似Modbus主从站问题)。
添加一个函数同步的特性,曾经看到了一次,记不住在哪个命名空间,备注一下!
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp12
{
public class Instance
{
public int sum = 0;
public static int sync = 0;
private SpinWait wait = new SpinWait();
public void GetSum(int total)
{
while (true)
{
if (Interlocked.CompareExchange(ref sync, 1, 0) == 0)
{
Console.WriteLine(DateTime.Now.ToString("yyyy MM dd HH ss mm fff"));
sum = 0;
for (int i = 1; i <= total; i++)
{
sum += i;
}
Console.WriteLine(sum);
Console.WriteLine(DateTime.Now.ToString("yyyy MM dd HH ss mm fff"));
Interlocked.CompareExchange(ref sync, 0, 1);
break;
}
else
{
wait.SpinOnce();
}
}
}
}
class Program
{
static void Main(string[] args)
{
Instance instance = new Instance();
Instance instance2 = new Instance();
Task.Factory.StartNew((a) =>
{
Instance obj = a as Instance;
obj.GetSum(1000000);
}, instance);
Task.Factory.StartNew((a) =>
{
Instance obj = a as Instance;
obj.GetSum(1000000);
}, instance);
Task.Factory.StartNew((a) =>
{
Instance obj = a as Instance;
obj.GetSum(1000000);
}, instance2);
Task.Factory.StartNew((a) =>
{
Instance obj = a as Instance;
obj.GetSum(1000000);
}, instance2);
Console.ReadKey();
}
}
}