多线程单例
using System; namespace Library { public class ABC { private static ABC instance; private ABC() { } public static ABC GetInstance() { if (instance == null) { instance = new ABC(); } return instance; } }
public class ABCLock { private static ABCLock instance; private static readonly object _syncLock = new object(); private ABCLock() { } public static ABCLock GetInstance() { if (instance == null) { lock (_syncLock) { if (instance == null) { instance = new ABCLock(); } } } return instance; } } public class ABCLockVolatile { private volatile static ABCLockVolatile instance; private static readonly object _syncLock = new object(); private ABCLockVolatile() { } public static ABCLockVolatile GetInstance() { if (instance == null) { lock (_syncLock) { if (instance == null) { instance = new ABCLockVolatile(); } } } return instance; } } public sealed class XYZ { private readonly static Lazy<XYZ> instance = new Lazy<XYZ>(() => new XYZ()); private XYZ() { } public static XYZ GetInstance() { return instance.Value; } } }
public class ABC
.class public auto ansi beforefieldinit Library.ABC extends [mscorlib]System.Object { // 成员 .field private static class Library.ABC 'instance' // 方法 .method private hidebysig specialname rtspecialname instance void .ctor () cil managed { // 方法起始 RVA 地址 0x2050 // 方法起始地址(相对于文件绝对值:0x0250) // 代码长度 7 (0x7) .maxstack 8 // 0x0251: 02 IL_0000: ldarg.0 // 0x0252: 28 12 00 00 0A IL_0001: call instance void [mscorlib]System.Object::.ctor() // 0x0257: 2A IL_0006: ret } // 方法 ABC::.ctor 结束 .method public hidebysig static class Library.ABC GetInstance () cil managed { // 方法起始 RVA 地址 0x2058 // 方法起始地址(相对于文件绝对值:0x0258) // 代码长度 23 (0x17) .maxstack 8 // 0x0259: 7E 01 00 00 04 IL_0000: ldsfld class Library.ABC Library.ABC::'instance' // 0x025E: 2D 0A IL_0005: brtrue.s IL_0011 // 0x0260: 73 01 00 00 06 IL_0007: newobj instance void Library.ABC::.ctor() // 0x0265: 80 01 00 00 04 IL_000c: stsfld class Library.ABC Library.ABC::'instance' // 0x026A: 7E 01 00 00 04 IL_0011: ldsfld class Library.ABC Library.ABC::'instance' // 0x026F: 2A IL_0016: ret } // 方法 ABC::GetInstance 结束 } // 类 Library.ABC 结束
public class ABCLock
.class public auto ansi beforefieldinit Library.ABCLock extends [mscorlib]System.Object { // 成员 .field private static class Library.ABCLock 'instance' .field private static initonly object _syncLock // 方法 .method private hidebysig specialname rtspecialname instance void .ctor () cil managed { // 方法起始 RVA 地址 0x2070 // 方法起始地址(相对于文件绝对值:0x0270) // 代码长度 7 (0x7) .maxstack 8 // 0x0271: 02 IL_0000: ldarg.0 // 0x0272: 28 12 00 00 0A IL_0001: call instance void [mscorlib]System.Object::.ctor() // 0x0277: 2A IL_0006: ret } // 方法 ABCLock::.ctor 结束 .method public hidebysig static class Library.ABCLock GetInstance () cil managed { // 方法起始 RVA 地址 0x2078 // 方法起始地址(相对于文件绝对值:0x0278) // 代码长度 58 (0x3a) .maxstack 2 .locals init ( [0] bool, [1] object ) // 0x0284: 7E 02 00 00 04 IL_0000: ldsfld class Library.ABCLock Library.ABCLock::'instance' // 0x0289: 2D 2D IL_0005: brtrue.s IL_0034 // 0x028B: 16 IL_0007: ldc.i4.0 // 0x028C: 0A IL_0008: stloc.0 .try { // 0x028D: 7E 03 00 00 04 IL_0009: ldsfld object Library.ABCLock::_syncLock // 0x0292: 25 IL_000e: dup // 0x0293: 0B IL_000f: stloc.1 // 0x0294: 12 00 IL_0010: ldloca.s 0 // 0x0296: 28 13 00 00 0A IL_0012: call void [mscorlib]System.Threading.Monitor::Enter(object, bool&) // 0x029B: 7E 02 00 00 04 IL_0017: ldsfld class Library.ABCLock Library.ABCLock::'instance' // 0x02A0: 2D 0A IL_001c: brtrue.s IL_0028 // 0x02A2: 73 03 00 00 06 IL_001e: newobj instance void Library.ABCLock::.ctor() // 0x02A7: 80 02 00 00 04 IL_0023: stsfld class Library.ABCLock Library.ABCLock::'instance' // 0x02AC: DE 0A IL_0028: leave.s IL_0034 } // .try 结束 finally { // 0x02AE: 06 IL_002a: ldloc.0 // 0x02AF: 2C 06 IL_002b: brfalse.s IL_0033 // 0x02B1: 07 IL_002d: ldloc.1 // 0x02B2: 28 14 00 00 0A IL_002e: call void [mscorlib]System.Threading.Monitor::Exit(object) // 0x02B7: DC IL_0033: endfinally } // 捕捉结束 // 0x02B8: 7E 02 00 00 04 IL_0034: ldsfld class Library.ABCLock Library.ABCLock::'instance' // 0x02BD: 2A IL_0039: ret } // 方法 ABCLock::GetInstance 结束 .method private hidebysig specialname rtspecialname static void .cctor () cil managed { // 方法起始 RVA 地址 0x20d0 // 方法起始地址(相对于文件绝对值:0x02d0) // 代码长度 11 (0xb) .maxstack 8 // 0x02D1: 73 12 00 00 0A IL_0000: newobj instance void [mscorlib]System.Object::.ctor() // 0x02D6: 80 03 00 00 04 IL_0005: stsfld object Library.ABCLock::_syncLock // 0x02DB: 2A IL_000a: ret } // 方法 ABCLock::.cctor 结束 } // 类 Library.ABCLock 结束
public class ABCLockVolatile
.class public auto ansi beforefieldinit Library.ABCLockVolatile extends [mscorlib]System.Object { // 成员 .field private static class Library.ABCLockVolatile modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) 'instance' .field private static initonly object _syncLock // 方法 .method private hidebysig specialname rtspecialname instance void .ctor () cil managed { // 方法起始 RVA 地址 0x20dc // 方法起始地址(相对于文件绝对值:0x02dc) // 代码长度 7 (0x7) .maxstack 8 // 0x02DD: 02 IL_0000: ldarg.0 // 0x02DE: 28 12 00 00 0A IL_0001: call instance void [mscorlib]System.Object::.ctor() // 0x02E3: 2A IL_0006: ret } // 方法 ABCLockVolatile::.ctor 结束 .method public hidebysig static class Library.ABCLockVolatile GetInstance () cil managed { // 方法起始 RVA 地址 0x20e4 // 方法起始地址(相对于文件绝对值:0x02e4) // 代码长度 66 (0x42) .maxstack 2 .locals init ( [0] bool, [1] object ) // 0x02F0: FE 13 IL_0000: volatile. // 0x02F2: 7E 04 00 00 04 IL_0002: ldsfld class Library.ABCLockVolatile modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) Library.ABCLockVolatile::'instance' // 0x02F7: 2D 31 IL_0007: brtrue.s IL_003a // 0x02F9: 16 IL_0009: ldc.i4.0 // 0x02FA: 0A IL_000a: stloc.0 .try { // 0x02FB: 7E 05 00 00 04 IL_000b: ldsfld object Library.ABCLockVolatile::_syncLock // 0x0300: 25 IL_0010: dup // 0x0301: 0B IL_0011: stloc.1 // 0x0302: 12 00 IL_0012: ldloca.s 0 // 0x0304: 28 13 00 00 0A IL_0014: call void [mscorlib]System.Threading.Monitor::Enter(object, bool&) // 0x0309: FE 13 IL_0019: volatile. // 0x030B: 7E 04 00 00 04 IL_001b: ldsfld class Library.ABCLockVolatile modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) Library.ABCLockVolatile::'instance' // 0x0310: 2D 0C IL_0020: brtrue.s IL_002e // 0x0312: 73 06 00 00 06 IL_0022: newobj instance void Library.ABCLockVolatile::.ctor() // 0x0317: FE 13 IL_0027: volatile. // 0x0319: 80 04 00 00 04 IL_0029: stsfld class Library.ABCLockVolatile modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) Library.ABCLockVolatile::'instance' // 0x031E: DE 0A IL_002e: leave.s IL_003a } // .try 结束 finally { // 0x0320: 06 IL_0030: ldloc.0 // 0x0321: 2C 06 IL_0031: brfalse.s IL_0039 // 0x0323: 07 IL_0033: ldloc.1 // 0x0324: 28 14 00 00 0A IL_0034: call void [mscorlib]System.Threading.Monitor::Exit(object) // 0x0329: DC IL_0039: endfinally } // 捕捉结束 // 0x032A: FE 13 IL_003a: volatile. // 0x032C: 7E 04 00 00 04 IL_003c: ldsfld class Library.ABCLockVolatile modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) Library.ABCLockVolatile::'instance' // 0x0331: 2A IL_0041: ret } // 方法 ABCLockVolatile::GetInstance 结束 .method private hidebysig specialname rtspecialname static void .cctor () cil managed { // 方法起始 RVA 地址 0x2144 // 方法起始地址(相对于文件绝对值:0x0344) // 代码长度 11 (0xb) .maxstack 8 // 0x0345: 73 12 00 00 0A IL_0000: newobj instance void [mscorlib]System.Object::.ctor() // 0x034A: 80 05 00 00 04 IL_0005: stsfld object Library.ABCLockVolatile::_syncLock // 0x034F: 2A IL_000a: ret } // 方法 ABCLockVolatile::.cctor 结束 } // 类 Library.ABCLockVolatile 结束
public sealed class XYZ
.class public auto ansi sealed beforefieldinit Library.XYZ extends [mscorlib]System.Object { // 成员 .field private static initonly class [mscorlib]System.Lazy`1<class Library.XYZ> 'instance' .field private static class [mscorlib]System.Func`1<class Library.XYZ> 'CS$<>9__CachedAnonymousMethodDelegate1' .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // 方法 .method private hidebysig specialname rtspecialname instance void .ctor () cil managed { // 方法起始 RVA 地址 0x2150 // 方法起始地址(相对于文件绝对值:0x0350) // 代码长度 7 (0x7) .maxstack 8 // 0x0351: 02 IL_0000: ldarg.0 // 0x0352: 28 12 00 00 0A IL_0001: call instance void [mscorlib]System.Object::.ctor() // 0x0357: 2A IL_0006: ret } // 方法 XYZ::.ctor 结束 .method public hidebysig static class Library.XYZ GetInstance () cil managed { // 方法起始 RVA 地址 0x2158 // 方法起始地址(相对于文件绝对值:0x0358) // 代码长度 11 (0xb) .maxstack 8 // 0x0359: 7E 06 00 00 04 IL_0000: ldsfld class [mscorlib]System.Lazy`1<class Library.XYZ> Library.XYZ::'instance' // 0x035E: 6F 15 00 00 0A IL_0005: callvirt instance !0 class [mscorlib]System.Lazy`1<class Library.XYZ>::get_Value() // 0x0363: 2A IL_000a: ret } // 方法 XYZ::GetInstance 结束 .method private hidebysig specialname rtspecialname static void .cctor () cil managed { // 方法起始 RVA 地址 0x216b // 方法起始地址(相对于文件绝对值:0x036b) // 代码长度 40 (0x28) .maxstack 8 // 0x036C: 7E 07 00 00 04 IL_0000: ldsfld class [mscorlib]System.Func`1<class Library.XYZ> Library.XYZ::'CS$<>9__CachedAnonymousMethodDelegate1' // 0x0371: 2D 11 IL_0005: brtrue.s IL_0018 // 0x0373: 14 IL_0007: ldnull // 0x0374: FE 06 0C 00 00 06 IL_0008: ldftn class Library.XYZ Library.XYZ::'<.cctor>b__0'() // 0x037A: 73 17 00 00 0A IL_000e: newobj instance void class [mscorlib]System.Func`1<class Library.XYZ>::.ctor(object, native int) // 0x037F: 80 07 00 00 04 IL_0013: stsfld class [mscorlib]System.Func`1<class Library.XYZ> Library.XYZ::'CS$<>9__CachedAnonymousMethodDelegate1' // 0x0384: 7E 07 00 00 04 IL_0018: ldsfld class [mscorlib]System.Func`1<class Library.XYZ> Library.XYZ::'CS$<>9__CachedAnonymousMethodDelegate1' // 0x0389: 73 18 00 00 0A IL_001d: newobj instance void class [mscorlib]System.Lazy`1<class Library.XYZ>::.ctor(class [mscorlib]System.Func`1<!0>) // 0x038E: 80 06 00 00 04 IL_0022: stsfld class [mscorlib]System.Lazy`1<class Library.XYZ> Library.XYZ::'instance' // 0x0393: 2A IL_0027: ret } // 方法 XYZ::.cctor 结束 .method private hidebysig static class Library.XYZ '<.cctor>b__0' () cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // 方法起始 RVA 地址 0x2164 // 方法起始地址(相对于文件绝对值:0x0364) // 代码长度 6 (0x6) .maxstack 8 // 0x0365: 73 09 00 00 06 IL_0000: newobj instance void Library.XYZ::.ctor() // 0x036A: 2A IL_0005: ret } // 方法 XYZ::'<.cctor>b__0' 结束 } // 类 Library.XYZ 结束

浙公网安备 33010602011771号