代码样例
public class MyClass{
private MyObject myObject;
private Object lockObject = new Object();
MyObjectFactory factory;
public MyClass(MyObjectFactory factory){
this.factory = factory;
}
public MyObject GetObject()
{
if (myObject == null){
lock(lockObject){
myObject = factory.Create();
//need forcibly sync myObject value beetween all threads here
}
}
return myObject;
}
}
MyClass实例共享beetwen几个线程。我知道我可以使用易失性myObject,它将在写入时同步字段值,但读取速度也会很慢。是否可以将myObject值仅一次同步到锁定部分而没有volatile?
您需要稍微更改代码,以实现双重检查模式:
public MyObject GetObject()
{
if (myObject == null)
{
lock(lockObject)
{
if (myObject == null)
{
myObject = factory.Create();
}
}
}
return myObject;
}
如果您的代码只能在x86 / x64处理器上运行,那么您就不需要volatile
关键字,因为CPU内存模型足够强大,可以确保其他线程myObject
可以在if
语句或第二条if
语句中看到对的更改。一旦获得锁。
或者,您可以使用LazyInitializer
该类将其隐藏起来:
private MyObject myObject;
private Object lockObject;
private MyObjectFactory factory;
private bool initialized;
public MyObject GetObject()
{
return LazyInitializer.EnsureInitialized(ref myObject, ref initialized, ref lockObject, factory.Create)
}
在这里,您只需在对象已创建时就对布尔值进行易读读取即可。请注意,如果尚未创建锁对象,则该方法将为您分配锁对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句