スレッド A とスレッド B の 2 つのスレッドがあるとします。スレッド A がオブジェクトを値に設定し、それをオブジェクト X と呼び、スレッド B が来て、スレッドによって設定されている間にそのオブジェクトを取得しようとすると、C# で何が起こるかあ?C# は例外をスローしますか? B は、A が変更を加える前にオブジェクト X を受け取りますか? それとも、A が変更を加えた後に B はオブジェクト 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 をチェックしてもどちらのスレッドが最初に処理されたかを特定することはできません...そして 1 つの出力で常にそれが行われます最初にコンソールに、つまり、誰が最初にサービスを提供したか、およびスレッドが get-set で実際に衝突したかどうかを言います。したがって、一部の人が言及しているように、最終的には、ロックはより低いフレームワーク レベルから C# の変数に実装されているようです。