每日技术干货,第一时间送达!
-
lock 阻塞式请求锁
-
trylock 尝试加锁,若锁已被占用,则失败返回,反之,则获取该锁
-
unlock 释放已经获取的锁
-
第一个参数为锁对象,即服务器对 “abc” 对象分配一个锁,所有对 "abc" 对象请求加锁的线程争用一个独占锁,该方法为一个阻塞方法,请求到锁则返回,如果锁被其他线程占用,则一直阻塞直至获取到锁。 -
第二个参数为持有该分布式锁的最长时间,单位为秒,例如 lock ("abc",3),意思是,如果超过 3 秒还没有调用 unlock 释放该锁,服务器将强制释放该锁,继续将锁分配给其他请求的线程。
MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
//java连接服务器
String key = null;
try{
key = mc.lock("testlock", 3); //获取分布式
... //执行业务逻辑程序
}finally {
if (key!=null){
mc.unLock(key); //释放分布式锁
}
}
import "github.com/donnie4w/tlmq-go/cli"
sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
//以上为 客户端连接MQ服务器
key, err := sc.Lock("testlock", 3)
//lock中两个参数,第一个参数为字符串,即tldb服务器为“testlock”分配一个全局的分布式锁
//第二个参数3为客户端持有该锁的最长时间,表示超过3秒没有释放锁时,tldb服务器将在服务端强制释放该锁,并分配给其他请求锁的线程
if err!=nil{
//获取锁失败,需查看tldb能正常访问
}else{
defer sc.UnLock(key) //获取锁成功后,必须在程序最后调用Unlock
//执行业务逻辑程序
}
sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
if key, ok := sc.TryLock("testlock2", 3); ok {
//ok为true,表示已经成功获取到分布式锁
defer sc.UnLock(key) //在程序最后释放锁对象
...
}
sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
var key string
for {
if v, ok := sc.TryLock("testlock", 3); ok {
key = v
break
} else {
<-time.After(100* time.Millisecond)
}
}
defer sc.UnLock(key)
...//业务逻辑代码
<dependency>
<groupId>io.github.donnie4w</groupId>
<artifactId>tlmq-j</artifactId>
<version>0.0.2</version>
</dependency>
MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
//java连接服务器
String key = null;
try{
key = mc.lock("testlock", 3); //获取分布式
... //执行业务逻辑程序
}finally {
if (key!=null){
mc.unLock(key); //释放分布式锁
}
}
MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
String key = null;
try{
key = mc.tryLock("testlock", 3); //获取分布式
... //执行业务逻辑程序
} finally {
if (key!=null){
mc.unLock(key); //释放分布式锁
}
}
往期推荐
如何在Nginx 中实现动态封禁IP
33.8k star,告别传统 CRM,一款现代化的开源 CRM 替代神器!
72K,一个收入被严重低估的方向!!
面试官:为什么数据库连接池不采用 IO 多路复用?
从零搭建制造业系统,一款牛逼的低代码神器!
又一款国产 Java 框架诞生了,太强了!!

