当前位置: 首页 > 面试题库 >

sync / atomic.once.go中的两个原子样式代码是否必要?

戚哲
2023-03-14
问题内容

sync / atomic.once.go中的代码是:

func (o *Once) Do(f func()) {
        if atomic.LoadUint32(&o.done) == 1 { //A
        //if o.done == 1 {
            return
        }
        // Slow-path.
        o.m.Lock()
        defer o.m.Unlock()
        if o.done == 0 {
            f()
            atomic.CompareAndSwapUint32(&o.done, 0, 1) //B
            //o.done = 1
        }
    }

我不认为上面两个“原子样式”代码A,B是必要或有用的。我认为该锁已足够,如果A,B不是原子样式,则可以。我必须错过一些事情,请告诉我代码A,B的目的。谢谢。


问题答案:

在原来是正确的。原因是Go
内存模型说,没有同步if o.done == 1),对o.done的更改可能根本不会被观察到。



 类似资料:
  • 问题内容: 和 第二个代码产生了一个空指针异常,该怎么做才能使下一个等效? 问题答案: 我可以看到,如果players某个自定义java.lang.Iterable的get()实现的实现被破坏,或者至少以一种异常的方式(与的行为不同),就会发生这种情况。 除此之外,我唯一能想到的就是您未在代码中向我们展示的某些内容导致了某些错误。 如果执行此操作会怎样?

  • 对于并发操作而言,原子操作是个非常现实的问题。典型的就是i 的问题。 当两个CPU同时对内存中的i进行读取,然后把加一之后的值放入内存中,可能两次i的结果,这个i只增加了一次。 如何保证多CPU对同一块内存的操作是原子的。 golang中sync/atomic就是做这个使用的。 具体的原子操作在不同的操作系统中实现是不同的。比如在Intel的CPU架构机器上,主要是使用总线锁的方式实现的。 大致的

  • 问题内容: 我无法通过实验进行检查,也无法从手册页中收集到它。 说我有两个过程,一个是将文件1从目录1移动(重命名)到目录2。假设正在运行的另一个进程同时将directory1和directory2的内容复制到另一个位置。复制是否可能以这种方式发生,即目录1和目录2都将显示文件1-即,目录1在移动之前被复制,目录2在移动之后被第一个进程复制。 基本上,rename()是原子系统调用吗? 谢谢 问题

  • 我有一个方法,它使用< code>java.util.Date和< code>java.util.Calendar对象为我提供时区的当前时间,我的一个同事建议添加try catch with < code > Exception e to catch。但是当我在google上搜索这些类的内置方法抛出的异常时,我没有发现任何异常。 我还需要用try和catch来包装代码吗???块是否需要try-ca

  • 我想重构一些UI代码。 我有一个HTML表单(这里:用一个叫做Wicket的Java GUI编写),在那里我放了一些链接(锚标签)。不是一遍又一遍地重复代码,我想创建一个新的优雅的helper方法。 你已经猜到了,我想要某物。就像 我想避免为此创建一个额外的类。但兰姆达斯就行了。 最好的方法是什么?而这个模式是怎么叫的呢? 多谢了。

  • 我想知道为什么下面的代码: 我被要求详细解释,但我不明白为什么输出是这样的。请有人帮帮我。