是的,返回的值都保证是 100*2 和 12345*2 ,没有任何明确的锁或障碍。
100*2
12345*2
就是这样 Task.Run 不是 await ,在这种情况下产生记忆障碍。
Task.Run
await
引用 在C#中精彩的Albahari线程 :
以下隐式生成完整的栅栏: C#的锁定语句(Monitor.Enter / Monitor.Exit) Interlocked类的所有方法(我们很快就会介绍) 的 使用线程池的异步回调 - 包括异步委托,APM回调和任务延续 强> 设置和等待信令构造 的 任何依赖于信令的东西,例如启动或等待任务 强> 凭借最后一点,以下是线程安全的: int x = 0; Task t = Task.Factory.StartNew (() => x++); t.Wait(); Console.WriteLine (x); // 1
以下隐式生成完整的栅栏:
凭借最后一点,以下是线程安全的:
int x = 0; Task t = Task.Factory.StartNew (() => x++); t.Wait(); Console.WriteLine (x); // 1
Task.Run 包装 ThreadPool.UnsafeQueueUserWorkItem ,属于“使用线程池的异步回调”。
ThreadPool.UnsafeQueueUserWorkItem
看到 记忆障碍发生器 有关创建记忆障碍的更全面的事项列表。