golang团队在sync中提供了很多的原子操作函数,将原子操作转向由单独一个包提供,而不是像Java那样提供各种累,确实上手得更加简单。但是golang原生提供的并发操作没有Java来得丰富,或者庞大(这里并不想展开语言相杀),只是笔者在练习的时候,想试着用golang实现类似Java中的valatile的语义功能,却发现golang没有提供类似的关键字,这个时候只能借助sync和sync/atmoic的同步语句来实现对应的功能。事实是,如果是借助锁的同步方式来实现对应的valatile语义,笔者认为大大浪费和误会了golang的设计协程的初衷,此时笔者想起了golang团队的一句话

StandardSessionisValidChanchan boolsessionsessionisValidChanvalatile
type StandardSession struct {

    isValidChan         chan bool
}
make(chan bool, 1);isValidChan <- true
//实现对IsValid原子修改
func (session *StandardSession) SetIsValid(isValid bool) {
    <-session.isValidChan
    session.isValidChan <- isValid
}

//实现对IsValid原子读取
func (session *StandardSession) IsValid() bool {
    b := <-session.isValidChan
    session.isValidChan <- b
    return b
}

    这里本质上还是同步化以达到共享变量的即时更新,volatile的原理是不需要通过同步指令,针对CPU指令级别的,是通过强制更新处理器内存,刷新CPU缓存以达到即时更新。所以这里只能说是笔者作为练习的模仿实现,如若读者有更好的实现,不吝赐教。

简书地址:https://www.jianshu.com/p/4a4feb2c5590