go两种方式实现trylock

在开发中遇到想要非阻塞加锁
看了下标准库没有实现trylock

构思了下有两种方式实现
1 是利用原子性

思路是某个值能否改变

2 是利用channel 和select

思路是有缓存管道 能往里面写证明可以加锁
业务处理完了 再取出值  可以做到信号量的作用同时控制多个 
但是由于channel 本事就是一把锁 性能肯定是没有原子好 ,业务简单还是原子好 但是channel 更加灵活

对于性能原子的更好,由于业务没有复杂最后还是选择原子的

type memory struct {
	...
	lock        int32 //0表示没有锁 没有正在载入  1表示正在读db锁了
	...
}
func (m *memory) tryLock() bool {
	return atomic.CompareAndSwapInt32(&m.lock, 0, 1)
}

func (m *memory) unlock() {
	atomic.CompareAndSwapInt32(&m.lock, 1, 0)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Java 中的 tryLock 方法可以用来实现自旋tryLock 方法尝试获取,如果获取成功,则立即返回 true,否则返回 false。可以在循环中调用 tryLock,直到成功获取为止。这样就可以实现自旋的效果。 例如: ``` Lock lock = new ReentrantLock(); while(!lock.tryLock()){ //do something } try{ //critical section }finally{ lock.unlock(); } ``` 这样做的缺点是会占用CPU资源,如果竞争激烈的话会导致性能问题。 ### 回答2: Java中的tryLock()方法是java.util.concurrent.locks.ReentrantLock类中的一个方法,用于实现自旋。自旋是一种基于循环的,当线程尝试获取时,如果发现已被其他线程持有,则不会进入等待状态,而是通过循环不断尝试获取,直到获取成功为止。 tryLock()方法可以尝试获取,如果当前没有被其他线程持有,则获取成功并返回true;如果已被其他线程持有,则获取失败,并立即返回false,不会阻塞线程。使用该方法可以避免线程进入等待状态,减少线程切换的开销,提高程序的执行效率。 tryLock()方法还提供了重载方法,可以设置超时时间,在限定的时间内尝试获取。如果超过指定的时间仍未获取到,则放弃获取,返回false。通过设置超时时间,可以防止线程长时间等待,避免可能的死情况发生。 自旋在某些场景下可以提高程序的性能,特别是对于的竞争不激烈、持有的时间较短的情况。但是在一些高并发场景下,长时间的自旋可能会消耗大量的CPU资源,导致程序性能下降。因此,需要根据具体的业务场景来选择合适的机制。 综上所述,Java的tryLock()方法实现了自旋,通过不断尝试获取而不进入等待状态,提高了程序的执行效率。但是需要注意在高并发场景下的使用,避免长时间的自旋带来的性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值