美文网首页golang研究所
golang并发获取唯一对象地址操作.

golang并发获取唯一对象地址操作.

作者: 百里江山 | 来源:发表于2020-02-16 20:55 被阅读0次

利用pointer, atomic原子操作.实现并发只获取一个操作对象.

import (
    "fmt"
    "sync/atomic"
    "testing"
    "time"
    "unsafe"
)
//使用自旋获取对象. 保证只有一个对象.
type EtcdClient struct {
    username string
    password string
    id int
}
func NewEtcdClient() *EtcdClient {
    return &EtcdClient{
        username:"etcd",
        password:"root!root",
        id: 100,
    }
}
var etcdClientPointer unsafe.Pointer

func Client() *EtcdClient {
    for {
        p := (*EtcdClient)(atomic.LoadPointer(&etcdClientPointer)) //如果指针存在则直接返回
        if p != nil {
            return p
        }
        //不存在则创建
        c := NewEtcdClient()
        //使用比较并载入操作
        if !atomic.CompareAndSwapPointer(&etcdClientPointer, nil, unsafe.Pointer(&c)) {
            time.Sleep(time.Nanosecond * 10) //休10纳秒
            continue
        }
        return c
    }
}

测试用例
获取得地址是一样的.

func TestNewEtcdClient(t *testing.T) {
    for i := 0;i < 10; i ++ {
        go func(i int) {
            fmt.Printf("%d, %p\n",i, Client())
        }(i)
    }
    time.Sleep(time.Second)
}

结果

0xc000062240 #这个地址与下面地址不一样, 这是因为这个地址是对象实际存储的地址
0xc000006018 # 以下地址是Pointer指针存储空间的地址.
0xc000006018
0xc000006018
0xc000006018
0xc000006018
0xc000006018
0xc000006018
0xc000006018
0xc000006018

相关文章

  • golang并发获取唯一对象地址操作.

    利用pointer, atomic原子操作.实现并发只获取一个操作对象. 测试用例获取得地址是一样的. 结果

  • golang记录

    获取本地IP 限制golang最大并发数 golang最快响应伪代码如下 反射修改对象属性 关于defer中坑的最...

  • Golang对象复用静态代码检查工具

    一、对象复用 在高并发的场景下使用golang,优化GC都会无法回避的问题。搜索「golang 垃圾回收优化」出来...

  • 并发map --- sync map分析

    [TOC] 本文基于1.10源码分析如之前的文章可以看到,golang中的map是不支持并发操作的,golang推...

  • Golang之并发编程一

    并发基础 在说Golang的并发编程之前,先认识一下目前并发的几种实现方式: 1.多进程。操作系统实现的并发模型,...

  • Swift 获取对象地址

    基于Swift3.0 获取地址的用处 最简单的实现对象比较(比如重载 == 来比较对象) 可行方法,代码如下:

  • golang 文件操作

    golang 文件操作 获取文件大小 "path/filepath" 读取文件 import ("fmt""os"...

  • jQuery设计思想

    1 jQuery 如何获取元素 jQuery获取选择器对应的元素对象,返回可操作对象. 利用操作对象的原型对象上...

  • GCD思考

    1.dispath-barrier_async用于操作对象时当并发读取处理时其中又参杂写操作 后面还有并发读取操作...

  • 05. Go极简教程 几句话说明白指针

    总结 指针对象是用来存储内存地址的数据类型 &符号获取对象的内存地址 *符号根据内存地址获取值, 只有指针对象可以...

网友评论

    本文标题:golang并发获取唯一对象地址操作.

    本文链接:https://www.haomeiwen.com/subject/vywmfhtx.html