在开发中遇到想要非阻塞加锁
看了下标准库没有实现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)
}