我对成员变量和静态变量进行了快速测试,我发现了一个有趣的结果,如果变量是静态对象的成员变量,即使在线程赛车上下文中总是正确计算,但如果是变量静态变量,它会碰到问题。
class Program
{
static void Main(string[] args)
{
var locker = new object();
ThreadPool.SetMaxThreads(64, 64);
var numOfThreads = 64;
WaitHandle[] waitHandles = new WaitHandle[numOfThreads];
var sw = new Stopwatch();
sw.Start();
for (long i = 0; i < numOfThreads; i++)
{
var handle = new EventWaitHandle(false, EventResetMode.ManualReset);
waitHandles[i] = handle;
ThreadPool.QueueUserWorkItem((state) =>
{
obj.run();
((EventWaitHandle)handle).Set();
}, handle);
//obj.run();
}
WaitHandle.WaitAll(waitHandles);
sw.Stop();
Console.WriteLine($"Exit Performance test {sw.ElapsedMilliseconds} output: {obj.x}");
Console.ReadKey();
}
static MyClass obj = new MyClass();
}
class MyClass
{
private object locker = new object();
//public static int x = 0;
public int x = 0;
public void run() {
//lock (locker)
{
for (int j = 0; j < 10000000; j++)
{
x = x + 1;
}
Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, count of loop: {x}");
}
var f = 0;
Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, $$start: {f}");
for (int j = 0; j < 10000000; j++)
{
f = f + 1;
}
Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, $$end: {f}");
}
}
由于我理解静态对象及其成员字段在多线程共享的内存中有1个实例副本,因此它应该与使用静态varialbe相同,但不知何故它的行为方式不同。
问题: 1.多线程中静态字段和成员字段之间的区别是什么? 2.这是否意味着静态字段的运行速度比成员字段快?
谢谢!
答案 0 :(得分:-1)
多线程中静态字段和成员字段之间的区别是什么? 我发现小循环成员字段几乎没有遇到多线程赛车问题,但是对于大循环10000000,它们都遇到赛车问题,因此两者都需要更衣柜。
这是否意味着静态字段的运行速度比成员字段快? 我发现使用储物柜比没有储物柜更快写入共享资源。