读写锁规则:
读写锁拥有两把锁,读锁
和写锁
。读写锁的特点是:同一时刻允许多个线程对共享资源进行读操作;同一时刻只允许一个线程对共享资源进行写操作;当进行写操作时,同一时刻其他线程的读操作会被阻塞;当进行读操作时,同一时刻所有线程的写操作会被阻塞。对于读锁而言,由于同一时刻可以允许多个线程访问共享资源,进行读操作,因此称它为共享锁;而对于写锁而言,同一时刻只允许一个线程访问共享资源,进行写操作,因此称它为排他锁
阻塞试实现:
共享资源:A
type A struct {
ReadClients []Rcilent
WriteClient Wclient
WaitClient [Rclient1, Rclient2,Wclient1, Rclient3]
}
衍生,非阻塞思想,如果只需要简单判断冲突:
共享资源:A
type A struct {
IsWrite bool
ReadNum int //记录重入数,也就是多少个客户端重入的一个计数器
}
形成规则:
获取A写锁:
func GetWriteLock(a A) bool {
if !a.IsWrite && a.ReadNum == 0 {
a.IsWrite = true
return true
}
return false
}
获取A读锁:
func GetReadLock(a A) bool {
if !a.IsWrite {
a.ReadNum++
return true
}
return false
}
释放A写锁:
func ReleaseWriteLock(a A) {
a.IsWrite = false
}
释放A读锁:
func ReleaseReadLock(a A) {
a.ReadNum--
}