假设我有两个线程,线程 A 和线程 B。在 C# 中,当线程 A 将一个对象(称为对象 X)设置为一个值并且线程 B 出现并尝试在线程设置该对象时获取该对象时会发生什么一种?C# 会抛出异常,B 会在 A 对其进行更改之前接收对象 X,还是 B 会在 A 对其进行更改后接收对象 X?
我认为这很清楚,但这里是代码(即使添加了同步,我仍然不能 100% 确定这会导致我上面提到的确切情况发生):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication8 {
public partial class Form1 : Form {
private AutoResetEvent waitEvent = new AutoResetEvent(false);
int objectX = 0;
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
DateTime startTime = DateTime.Now;
Console.WriteLine("---------------------------- START @ " + startTime + " ----------------------------------------------------------------------");
Thread A = new Thread(ThreadAWorkMethod);
Thread B = new Thread(ThreadBWorkMethod);
objectX = 0;
waitEvent = new AutoResetEvent(false);
A.Start();
B.Start();
A.Join();
B.Join();
Console.WriteLine("---------------------------- FINISHED AFTER " + (DateTime.Now - startTime).TotalMilliseconds + " ----------------------------");
}
public void ThreadAWorkMethod() {
waitEvent.WaitOne();
objectX = 5;
Console.WriteLine("Value has been changed to: " + objectX + " in thread A at " + DateTime.Now);
return;
}
public void ThreadBWorkMethod() {
waitEvent.Set();
string xInThreadB = objectX.ToString();
Console.WriteLine("Value in thread B: " + xInThreadB + " at " + DateTime.Now);
return;
}
}
}
线程 B 到控制台的输出看起来是 0 或 5,但即使通过检查 DateTime,您仍然不能确定哪个线程首先得到服务,因为两个线程将具有相同的时间戳......并且一个输出总是使它首先到控制台,所以谁说哪个先得到服务,以及线程是否真的在 get-set 上发生了冲突。因此,最终似乎正如某些人所提到的,锁定是从较低的框架级别对 C# 中的变量实现的。