ToB企服应用市场:ToB评测及商务社交产业平台
标题:
go 系列之 once
[打印本页]
作者:
丝
时间:
2024-8-22 18:24
标题:
go 系列之 once
一、简介
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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4