用java实现etcd分布式锁_etcd实现分布式锁

分布式锁在后台应用广泛,抢票系统,秒杀系统都能看到它的身影,实现分布式锁的方式有很多,比如zookeeper,redis,以及etcd。下面用一个简单的用例来说明etcd的实现。

package main

import (

"context"

"fmt"

"github.com/coreos/etcd/clientv3"

"github.com/coreos/etcd/clientv3/concurrency"

"log"

"time"

)

func main() {

cli,err := clientv3.New(clientv3.Config{

Endpoints: []string{"localhost:12379", "localhost:22379", "localhost:32379"},

AutoSyncInterval: 0,

DialTimeout: 5 * time.Second,

DialKeepAliveTime: 0,

DialKeepAliveTimeout: 0,

MaxCallSendMsgSize: 0,

MaxCallRecvMsgSize: 0,

TLS: nil,

Username: "",

Password: "",

RejectOldCluster: false,

DialOptions: nil,

Context: nil,

})

if err != nil{

log.Fatal("err:",err.Error())

}

// 创建两个单独的会话用来演示锁竞争

s1,err := concurrency.NewSession(cli)

if err != nil{

log.Fatal(err)

}

defer s1.Close()

m1 := concurrency.NewMutex(s1,"/my-lock/")

s2,err := concurrency.NewSession(cli)

if err != nil{

log.Fatal(err)

}

defer s2.Close()

m2 := concurrency.NewMutex(s2,"/my-lock/")

// 会话s1获取锁

if err := m1.Lock(context.TODO());err != nil{

log.Fatal(err)

}

m2Locked := make(chan struct{})

go func() {

defer close(m2Locked)

// 等待直到会话s1释放了/my-lock/的锁

if err := m2.Lock(context.TODO());err != nil{

log.Fatal(err)

}

fmt.Println("m2 locked")

}()

if err := m1.Unlock(context.TODO());err != nil{

log.Fatal(err)

}

fmt.Println("released lock for s1")

fmt.Println("acquired lock for s2")

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值