如何强制一次间同步两个字段之间的字段值?

弗兰克59

代码样例

    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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何强制一次间同步两个字段之间的字段值?

来自分类Dev

搜索两个字段,但在Elasticsearch中仅得分一次

来自分类Dev

SQL查询-一次链接到具有两个字段的查找

来自分类Dev

如何查询时间是否在两个字段值之间

来自分类Dev

如何对齐两个字段

来自分类Dev

如何选择两个字段?

来自分类Dev

如何对齐两个字段

来自分类Dev

如何对两个字段求和

来自分类Dev

如何将两个字段的值作为一个过滤?

来自分类Dev

如何根据两个字段值导出唯一文档?

来自分类Dev

如何从同一行的两个字段相减中获得 MAX() 值

来自分类Dev

如何一次解析两个字符进行一次迭代?

来自分类Dev

如何一次遍历两个字典并使用两个字典中的值和键来获得结果

来自分类Dev

如何一次迭代两个字典并使用两个字典中的值和键来获得结果

来自分类Dev

来自不同行的两个字段之间的差异

来自分类Dev

两个字段之间的Rails存在条件验证

来自分类Dev

两个字段之间的Rails存在条件验证

来自分类Dev

如何从存储库中获取一个值,该值与表的两个字段进行比较

来自分类Dev

Python + Glade + PyGObject。如何一次获得两个文本字段的值?

来自分类Dev

Mongodb:搜索在两个字段之间具有一对多映射的条目

来自分类Dev

通过两个字段获取不同的值

来自分类Dev

将变量中的值分成两个字段

来自分类Dev

从表JOIN中获取两个字段的值

来自分类Dev

拒绝两个字段中的空值

来自分类Dev

水晶报表-连接表时如何在两个字段之间放置“或”条件?

来自分类Dev

如何在Firestore中的两个字段之间查询?

来自分类Dev

水晶报表-连接表时如何在两个字段之间放置“或”条件?

来自分类Dev

CouchDB从两个字段中查看唯一/唯一值

来自分类Dev

对两个字段的唯一约束,相反的

Related 相关文章

  1. 1

    如何强制一次间同步两个字段之间的字段值?

  2. 2

    搜索两个字段,但在Elasticsearch中仅得分一次

  3. 3

    SQL查询-一次链接到具有两个字段的查找

  4. 4

    如何查询时间是否在两个字段值之间

  5. 5

    如何对齐两个字段

  6. 6

    如何选择两个字段?

  7. 7

    如何对齐两个字段

  8. 8

    如何对两个字段求和

  9. 9

    如何将两个字段的值作为一个过滤?

  10. 10

    如何根据两个字段值导出唯一文档?

  11. 11

    如何从同一行的两个字段相减中获得 MAX() 值

  12. 12

    如何一次解析两个字符进行一次迭代?

  13. 13

    如何一次遍历两个字典并使用两个字典中的值和键来获得结果

  14. 14

    如何一次迭代两个字典并使用两个字典中的值和键来获得结果

  15. 15

    来自不同行的两个字段之间的差异

  16. 16

    两个字段之间的Rails存在条件验证

  17. 17

    两个字段之间的Rails存在条件验证

  18. 18

    如何从存储库中获取一个值,该值与表的两个字段进行比较

  19. 19

    Python + Glade + PyGObject。如何一次获得两个文本字段的值?

  20. 20

    Mongodb:搜索在两个字段之间具有一对多映射的条目

  21. 21

    通过两个字段获取不同的值

  22. 22

    将变量中的值分成两个字段

  23. 23

    从表JOIN中获取两个字段的值

  24. 24

    拒绝两个字段中的空值

  25. 25

    水晶报表-连接表时如何在两个字段之间放置“或”条件?

  26. 26

    如何在Firestore中的两个字段之间查询?

  27. 27

    水晶报表-连接表时如何在两个字段之间放置“或”条件?

  28. 28

    CouchDB从两个字段中查看唯一/唯一值

  29. 29

    对两个字段的唯一约束,相反的

热门标签

归档