go线程安全与java_go – 这是否具有并发访问的线程安全性?

是的,如果只有这3个方法访问计数字段,您的解决方案可以安全地从多个goroutine同时使用.

但是要知道,当你尝试使用它时,Status.Get()返回的值可能会“过时”.例如.:

s := &Status{}

if s.Get() == 3 {

fmt.Println(s.Get()) // This may or may not print 3

}

// Or

c := s.Get()

fmt.Println(c == s.Get()) // This may or may not print true

上面的例子可能会打印3也可能不打印,因为对s.Get()的第二次调用可能会在另一个goroutine中再次调用s.Add().

如果您需要保证在执行进一步计算时没有其他人修改或访问Status.count字段的值,那么sync.Mutex或sync.RWMutex是可行的方法,因为您可以在完成计数字段时锁定计数字段计算.

编辑:要回答您的修改:

直接访问s.count是不安全的,atomic.LoadUint32(& s.count)是安全的.原因是因为如果goroutine#1调用s.Add(),并且goroutine#2尝试访问s.count,则无法保证goroutine#2将看到#1所做的更改.在#2中,您可能只看到s.count的缓存版本.

如果没有明确的同步,您无法保证观察到对另一个goroutine中的变量所做的更改.直接访问s.count是一种不同步的访问.使用通道或其他同步原语(例如sync或sync/atomic包)可确保对s.count的序列化访问,因此这些解决方案将始终看到当前的更新值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值