1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace CLibrary.ConsoleApp.Core
8 {
9 /// <summary>
10 /// 饿汉模式(推荐使用):在类创建时已经将实例加载到内存,天生线程安全,第一次调用比较快。
11 /// </summary>
12 /// <typeparam name="T"></typeparam>
13 public class Singleton_EHan<T> where T : class, new()
14 {
15 //饿汉式是线程安全的,因为虚拟机保证只会装载一次,在装载类的时候是不会发生并发的。
16 private static readonly T _instance = new T();
17 public static T Current { get { return _instance; } }
18 }
19
20 /// <summary>
21 /// 懒汉模式:双重锁保证线程安全,第一次调用较慢。
22 /// </summary>
23 /// <typeparam name="T"></typeparam>
24 public class Singleton_LanHan<T> where T : class, new()
25 {
26 private static readonly object sycLock = new object();
27 //不允许线程进行本地缓存,每个线程的读写都是直接操作在共享内存上,这就保证了变量始终具有一致性。缺点很明显:牺牲了效率,
28 //但是多核CPU情况下线程不安全。
29 private static volatile T _instance;
30 public static T Current
31 {
32 get
33 {
34 if (_instance == null)
35 {
36 lock (sycLock)
37 {
38 if (_instance == null)
39 {
40 _instance = new T();
41 }
42 }
43 }
44 return _instance;
45 }
46 }
47 }
48 }