34 lines
1006 B
Go
34 lines
1006 B
Go
|
|
/*
|
|||
|
|
由于Go不提供超时锁,所以自己实现了支持超时机制的互斥锁Locker和读写锁RWLocker。
|
|||
|
|
为了方便供第三方程序使用,提供了根据Key获取超时互斥锁和超时读写锁的复合对象LockerUtil和RWLockerUtil。
|
|||
|
|
为了在出现锁超时时方便查找问题,会记录上次成功获得锁时的堆栈信息;并且在本次获取锁失败时,同时返回上次成功时的堆栈信息和本次的堆栈信息。
|
|||
|
|
*/
|
|||
|
|
package syncUtil
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
// 默认超时的毫秒数(1小时)
|
|||
|
|
con_Default_Timeout_Milliseconds = 60 * 60 * 1000
|
|||
|
|
|
|||
|
|
// 写锁保护时间(纳秒)
|
|||
|
|
con_Write_Protect_Nanoseconds = 5 * 1000 * 1000
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var (
|
|||
|
|
// 是否记录堆栈信息的状态
|
|||
|
|
if_record_stack_info = false
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 获取超时时间
|
|||
|
|
func getTimeout(timeout int) int {
|
|||
|
|
if timeout > 0 {
|
|||
|
|
return timeout
|
|||
|
|
} else {
|
|||
|
|
return con_Default_Timeout_Milliseconds
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置是否记录堆栈信息的状态
|
|||
|
|
func SetIfRecordStackInfo(value bool) {
|
|||
|
|
if_record_stack_info = value
|
|||
|
|
}
|