使用C ++而不是C#编写Windows?
|
通过基准测试,它的性能和 New2 差不多。 此外,无论是 Java 还是 Go,都有一些其他“黑魔法”,比如 Go 语言中,利用 init 函数来初始化唯一的单例。不过一般都不太建议,还是常规方式来。 Go 语言单例模式,一般推荐优先考虑使用饿汉式。但如果初始化比较耗时,懒汉式延迟初始化是更好的选择。 4、使用场景 在 Go 语言中,如下两个场景比较适合使用单例模式:
有读者可能看不懂上面代码的意思,这里详细解释下。假设 goroutine X 和 Y 作为第一批调用者同时或几乎同时调用 New 函数。
到这里,goroutine X 和 Y 得到了同一个 singleton 实例。可见上面的 New 函数中,锁仅用来避免多个 goroutine 同时实例化 singleton。
相比前面的版本,双重检查版本,只要 instance 实例化后,锁永远不会执行了,而前面版本每次调用 New 获取实例都需要执行锁。性能很显然,我们可以基准测试来验证:(双重检查版本 New 重命名为 New2) 代码多了不少:
关于懒汉式有一个“双重检查”,这是 C 语言的一种代码模式。
在上面 New() 函数中,同步化(锁保护)实际上只在 instance 变量第一次被赋值之前才有用。在 instance 变量有了值之后,同步化实际上变成了一个不必要的瓶颈。如果能够有一个方法去掉这个小小的额外开销,不是更加完美吗?因此出现了“双重检查”。看看 Go 如何实现“双重检查”,只看 New() 代码: (编辑:广元站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


