C#中 类静态成员 的 Lazy Loading


静态成员 (static) 在面向对象程序语言中就有点像全局变量的意思, 静态成员在所有的对象中都只在内存中存一份 copy, 而且不需要类实例化就能使用, 比如在C#里可以有 static class只能包含 static 的方法.

在JAVA中, 你可以把静态成员在 static 块中创建.

1
2
3
4
5
6
public class Sample {
  public static Object obj;
  static {
    obj = new Object();
  }
}
public class Sample {
  public static Object obj;
  static {
    obj = new Object();
  }
}

还有一种就是直接在声明变量的时候就创建, 这在 C# 里也是一样的.

1
2
3
public class Sample {
  public static Object obj = new Object();
}
public class Sample {
  public static Object obj = new Object();
}

如果你的全局对象并不是马上就要用, 比如一些模块开启后才会被使用, 那么, 你就可以通过 Lazy Loading 的方式推迟创建和加载.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Sample {
  private static Object _obj;
  public static Obj {
    get {
      if (_obj == null) {
         lock(_obj) {
             if (_obj == null) {
                 _obj = new Object();
             }
         }
      }
      return _obj;
    }
  }
}
public class Sample {
  private static Object _obj;
  public static Obj {
    get {
      if (_obj == null) {
         lock(_obj) {
             if (_obj == null) {
                 _obj = new Object();
             }
         }
      }
      return _obj;
    }
  }
}

上面的代码中, 先定义了一个私有变量, 然后在公有的属性 get 中, 先是判断是否为 null, 如果还没被创建, 那么就锁定 (lock) 因为有可能同时多个线程会访问到这个变量, 需要进行资源锁定, 然后锁定之后由其中一个线程去创建, 然后等资源释放后, 其它线程还需要再判断是否为 null.

最外面的 if 判断就是为了加速, 因为 lock 毕竟速度慢, 当第一次创建后, 以后多个线程在读的时候就不需要再锁了.

英文同步: https://helloacm.com/static-object-global-variable-lazy-loading-in-c/

GD Star Rating
loading...
本文一共 318 个汉字, 你数一下对不对.
C#中 类静态成员 的 Lazy Loading. (AMP 移动加速版本)
上一篇: 一行代码修改引起的血案 - (二)
下一篇: 雅俗共赏: 某公司的年会

扫描二维码,分享本文到微信朋友圈
480cff9ca9ebcfb747176c3b462594bd C#中 类静态成员 的 Lazy Loading 学习笔记 技术

评论