go 系列之 once

  金牌会员 | 2024-8-22 18:24:58 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 507|帖子 507|积分 1521



一、简介

       once 方法用于包管指定函数只执行一次。比方配置懒加载,客户端获取密钥等场景,都可以用到once。
二、技术实现

2.1 Once.go

  1. type Once struct {
  2.         done atomic.Uint32
  3.         m    Mutex
  4. }
  5. func (o *Once) Do(f func()) {
  6.         if o.done.Load() == 0 {
  7.                
  8.                 o.doSlow(f)
  9.         }
  10. }
  11. func (o *Once) doSlow(f func()) {
  12.         o.m.Lock()
  13.         defer o.m.Unlock()
  14.         if o.done.Load() == 0 {
  15.                 defer o.done.Store(1)
  16.                 f()
  17.         }
  18. }
复制代码
  1. type DemoClient struct {
  2.         secretKey string
  3.         once      sync.Once
  4. }
  5. func (c *DemoClient) getSecretKey() string {
  6.     c.once.Do(func() {
  7.                 c.secretKey = string(rand.Int63())
  8.         })
  9.         return c.secretKey
  10. }
复制代码
2.2 Once.java

  1. public class Once {
  2.     private volatile  boolean done = false;
  3.     private Runnable func;
  4.     public Once(Runnable func) {
  5.         this.func = func;
  6.     }
  7.     public void exec(){
  8.         if (done){
  9.             return;
  10.         }
  11.         synchronized (this){
  12.             if (!done){
  13.                 func.run();
  14.                 done = true;
  15.             }
  16.         }
  17.     }
  18. }
复制代码
  1. /**
  2. * 使用样例
  3. */
  4. public class DemoClient {
  5.     private String secretKey;
  6.    
  7.     private Once once = new Once(()->{
  8.         secretKey = RandUtil.randAlpha(32);
  9.     });
  10.    
  11.     public String getSecretKey(){
  12.         once.exec();
  13.         return secretKey;
  14.     }
  15. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表