关于此函数的同步问题,做一个小例子,以备工作参考,注意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(); } } }