|
|
@@ -6,53 +6,33 @@ namespace ET
|
|
|
public interface ISingleton: IDisposable
|
|
|
{
|
|
|
void Register();
|
|
|
- bool IsDisposed();
|
|
|
}
|
|
|
|
|
|
public abstract class Singleton<T>: ISingleton where T: Singleton<T>, new()
|
|
|
{
|
|
|
private bool isDisposed;
|
|
|
-
|
|
|
- [StaticField]
|
|
|
- private static SpinLock spinLock;
|
|
|
|
|
|
[StaticField]
|
|
|
private static T instance;
|
|
|
+
|
|
|
+ [StaticField]
|
|
|
+ private static readonly object lockObj = new();
|
|
|
|
|
|
- // 自旋锁保证线程安全
|
|
|
public static T Instance
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
- bool lockTaken = false;
|
|
|
- try
|
|
|
- {
|
|
|
- spinLock.Enter(ref lockTaken);
|
|
|
- return instance;
|
|
|
- }
|
|
|
- finally
|
|
|
+ lock (lockObj)
|
|
|
{
|
|
|
- if (lockTaken)
|
|
|
- {
|
|
|
- spinLock.Exit();
|
|
|
- }
|
|
|
+ return instance;
|
|
|
}
|
|
|
}
|
|
|
set
|
|
|
{
|
|
|
- bool lockTaken = false;
|
|
|
- try
|
|
|
+ lock (lockObj)
|
|
|
{
|
|
|
- spinLock.Enter(ref lockTaken);
|
|
|
instance = value;
|
|
|
}
|
|
|
- finally
|
|
|
- {
|
|
|
- if (lockTaken)
|
|
|
- {
|
|
|
- spinLock.Exit();
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -61,48 +41,35 @@ namespace ET
|
|
|
Instance = (T)this;
|
|
|
}
|
|
|
|
|
|
- public virtual bool IsDisposed()
|
|
|
+ public bool IsDisposed()
|
|
|
{
|
|
|
- bool lockTaken = false;
|
|
|
- try
|
|
|
+ lock (lockObj)
|
|
|
{
|
|
|
- spinLock.Enter(ref lockTaken);
|
|
|
-
|
|
|
return this.isDisposed;
|
|
|
}
|
|
|
- finally
|
|
|
- {
|
|
|
- if (lockTaken)
|
|
|
- {
|
|
|
- spinLock.Exit();
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
- public virtual void Dispose()
|
|
|
+ public virtual void Destroy()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void IDisposable.Dispose()
|
|
|
{
|
|
|
- bool lockTaken = false;
|
|
|
- try
|
|
|
+ T t;
|
|
|
+ lock (lockObj)
|
|
|
{
|
|
|
- spinLock.Enter(ref lockTaken);
|
|
|
-
|
|
|
if (this.isDisposed)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
this.isDisposed = true;
|
|
|
|
|
|
- T t = instance;
|
|
|
+ t = instance;
|
|
|
instance = null;
|
|
|
- t.Dispose();
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
- if (lockTaken)
|
|
|
- {
|
|
|
- spinLock.Exit();
|
|
|
- }
|
|
|
}
|
|
|
+
|
|
|
+ t.Destroy();
|
|
|
}
|
|
|
}
|
|
|
}
|