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