using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test1{ class Program { static void Main(string[] args) { AppConfig.GetAppConfig(); } }}//===============================================================================================
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test1{ public class AppConfig { //懒汉,单线程时的单例, //线程不安全,即多个线程可同时访问,不能保证结果的二义性 private static AppConfig test1; private AppConfig() { Console.WriteLine("我成功创建了一个AppConfig啦!"); } public static AppConfig GetAppConfig() { if (test1 == null) { test1 = new AppConfig(); } return test1; } //懒汉,多线程时的单例, //线程安全,当一个线程位于代码的临界区时,另一个线程不进入临界区 //如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止), //直到该对象被释放。 //private static AppConfig test1; //private static readonly object syncRoot = new object(); //private AppConfig() //{ // Console.WriteLine("我成功创建了一个AppConfig啦!"); //} //public static AppConfig GetAppConfig() //{ // lock (syncRoot) // { // if (test1 == null) // { // test1 = new AppConfig(); // } // } // return test1; //} //饿汉 //private static AppConfig test1 = new AppConfig(); //private AppConfig() //{ // Console.WriteLine("我成功创建了一个AppConfig啦!"); //} //public static AppConfig GetAppConfig() //{ // return test1; //} //双重锁定 //private static AppConfig test1; //private static readonly object syncRoot = new object(); //private AppConfig() //{ // Console.WriteLine("我成功创建了一个AppConfig啦!"); //} //public static AppConfig GetAppConfig() //{ // //由于lock机制,必须其中的一个进入并出来之后,另一个才能进入, // //如果没有第二层,则第一个线程创建了实例,第二个线程还是可以 // //创建新的实例,就不满足单例的目的 // if (test1 == null) // { // lock (syncRoot) // { // if (test1 == null) // { // test1 = new AppConfig(); // } // } // } // return test1; //} }}