QuillContainer#GetComponentのスレッドセーフを検証してみた

.NET版SeasarにはQuillという簡易DIコンテナがあるのですが
たまに「QuillのGetComponentはスレッドセーフなの?」と
聞かれることがあります。


中でlockステートメントを使っているから大丈夫☆
……で終わらせるのはいささか乱暴なので
検証コードを書いてみました。
(MbUnitを使っていますが、usingを書き換えればNUnitでも
動くかと思います)


using System.Threading;
using MbUnit.Framework;
using Seasar.Quill;
using Seasar.Quill.Util;

namespace Seasar.Tests.Quill
{
[TestFixture]
public class ThreadSafeTest
{
QuillContainer _container = new QuillContainer();

[Test]
public void TestThreadSafe()
{
Thread t1 = new Thread(MyGetComponent);
Thread t2 = new Thread(MyGetComponent);
Thread t3 = new Thread(MyGetComponent);

t1.Start();
t2.Start();
t3.Start();

t1.Join();
t2.Join();
t3.Join();

Assert.AreEqual(1, HeavyClass.Result,
"コンストラクタが1回しか呼ばれていなけりゃ1ですよね");
}

private void MyGetComponent()
{
_container.GetComponent(typeof(HeavyClass));
}
}

public class HeavyClass
{
public static int Result = 0;
public HeavyClass()
{
// とりあえず500ms待ってみる
// 待機中に別スレッドがGetComponentしても
// インスタンスが二重三重に作られないか
// チェックするため
Thread.Sleep(500);
Result++;
}
}
}



これでスレッドセーフの証明になるかどうかは
自信のない部分があったりするので
ツッコミのある方は私が泣かない程度に
お願い致します(^^;