我对成员变量和静态变量进行了快速测试,我发现了一个有趣的结果,如果变量是静态对象的成员变量,即使在线程赛车上下文中总是正确计算,但是如果变量是静态变量,它会遇到问题。
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.这是否意味着静态字段比成员字段运行得更快?
谢谢!