单身人士中的静态/易变

时间:2013-01-29 15:55:28

标签: c#

制作单身System.Timers.Timer的{​​{1}}成员是否有意义?

如果我在单例实例上下文中设置volatile static _fooTimer和/ static会有什么不同吗?

如果我不制作volatile _instance会不会有什么不同?

EDIT2:我更正了codeample并使其成为更好的Singleton而没有不必要的静态或易失性字段并更改为Interlock.Increment

static

2 个答案:

答案 0 :(得分:9)

单例类中的 only 静态变量通常是对单个实例的引用。然后,您可以将实例变量用于该类型的剩余状态。如果你把它设置为静态,那么你甚至不需要创建一个单个类的实例来使用计时器 - 但我会期望你想做什么所以无论如何。

我对使用volatile感到紧张......这几乎肯定并不意味着你认为它意味着什么。我可能会使用Interlocked来实现变量的原子更新。

(请注意,根据my article on the topic,有很多更好的方法可以实现它。)

编辑:现在代码已经更改为显示更多成员,这有点令人困惑。有一个静态方法可以使用_counter(一个实例变量) - 可能是通过单例实例。基本上,这个类似乎没有决定它是想成为一堆静态方法还是单例实例。我建议你决定以某种方式使所有可以访问,但不能混合使用。

答案 1 :(得分:1)

通过使整个类保持静态,您可以在创建实例期间将任何线程同步问题推送到CLR:

public static class Foo
{
  private static Timer _fooTimer;

  static Foo()
  {
     _fooTimer = new Timer();
  }
}