一、简介
once 方法用于包管指定函数只执行一次。比方配置懒加载,客户端获取密钥等场景,都可以用到once。
二、技术实现
2.1 Once.go
- type Once struct {
- done atomic.Uint32
- m Mutex
- }
- func (o *Once) Do(f func()) {
- if o.done.Load() == 0 {
-
- o.doSlow(f)
- }
- }
- func (o *Once) doSlow(f func()) {
- o.m.Lock()
- defer o.m.Unlock()
- if o.done.Load() == 0 {
- defer o.done.Store(1)
- f()
- }
- }
复制代码- type DemoClient struct {
- secretKey string
- once sync.Once
- }
- func (c *DemoClient) getSecretKey() string {
- c.once.Do(func() {
- c.secretKey = string(rand.Int63())
- })
- return c.secretKey
- }
复制代码 2.2 Once.java
- public class Once {
- private volatile boolean done = false;
- private Runnable func;
- public Once(Runnable func) {
- this.func = func;
- }
- public void exec(){
- if (done){
- return;
- }
- synchronized (this){
- if (!done){
- func.run();
- done = true;
- }
- }
- }
- }
复制代码- /**
- * 使用样例
- */
- public class DemoClient {
- private String secretKey;
-
- private Once once = new Once(()->{
- secretKey = RandUtil.randAlpha(32);
- });
-
- public String getSecretKey(){
- once.exec();
- return secretKey;
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |