单例死锁错误

exH*_*ash 0 .net c# singleton design-patterns

我正在尝试更多地设计模式,我正在构建一个快速测试,以帮助我进一步了解单例模式.然而,我在.net中遇到了一个让我感到困惑的错误,是什么让它更奇怪我无法复制错误,这只会增加我的困惑.下面的代码不是世界上最好的代码,但我随机测试的东西可以帮助我更深入地理解.

class Program
{

    static void Main(string[] args)
    {
        Thread t1 = new Thread(new ThreadStart(run1));
        Thread t2 = new Thread(new ThreadStart(run2));

        t1.Priority = ThreadPriority.Lowest;
        t1.Start();
        t2.Priority = ThreadPriority.Lowest;
        t2.Start();

        Console.ReadLine();
    }

    public static void run1()
    {
        Console.WriteLine("im in run1 \n");
        TestSingleton._instance.PopulateCrudItemsProcess();
        Thread.Sleep(1000);
        Console.WriteLine(TestSingleton._instance.GetStrValue("first", 1000));
    }
    public static void run2()
    {
        Console.WriteLine("im in run2 \n");
        TestSingleton._instance.PopulateCrudItemsProcess();
        Console.WriteLine(TestSingleton._instance.GetStrValue("second", 500));

    }

}

sealed class TestSingleton
{
    private TestSingleton() { }

    public static readonly TestSingleton _instance = new TestSingleton();

    public string GetStrValue(string str, int time)
    {
        return str;
    }

    public void PopulateCrudItemsProcess()
    {
        const string proc = "[testdb].[dbo].[tstsproc]";
        string _reportingConnStr = ConfigurationManager.ConnectionStrings["reporting"].ConnectionString;

        using (SqlConnection conn = new SqlConnection(_reportingConnStr))
        {
            using (SqlCommand cmd = new SqlCommand(proc, conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandTimeout = 7200;
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在发生的事情是程序在cmd.ExecuteNonQuery()上崩溃了; 并表示资源存在僵局.我希望我能抓住实际的错误,但就像我说我只能得到错误一次.根据MS,这段代码是一种创建单例的线程安全方法.那么对可能导致错误的原因有什么看法?任何信息都非常感谢.

Rvd*_*vdK 5

对不起,但是Singleton不是关于线程安全的.它只有一个对象的实例.

因此PopulateCrudItemsProcess,GetStrValue并非线程安全...

  • 就单身而言,它们*是*线程安全的.在课堂上没有共享状态 - 哎呀,这些方法可以是静态的.在哪里*确切*你认为它们不是线程安全的?(我希望存储过程可能会因为尝试同时在两个线程中填充数据库而失败,但这与这些方法本身不是线程安全的不一样.如果你试图运行,你会得到同样的东西同时来自两个独立*进程*的同一方法.)它们不是线程安全的*因为它当然是单例*,但这是另一回事. (2认同)