当前位置: 首页 > 网络应用技术

进行并发编程 - sync.once

时间:2023-03-07 00:22:20 网络应用技术

  它可以用来执行一个函数,但是此函数仅执行一次,经常在单个对象的初始化场景中使用。说,我必须谈论一个示例。

  单个示例中有两种类型的懒惰和饥饿的汉风格。

  顾名思义,饥饿的han风格更加饥饿,因此在出现时将其初始化。

  顾名思义,懒惰的风格是懒惰的。在获取示例时,进行初始化,但是懒惰的han样式将存在并发问题。在此判断条件下发生并发的问题可能是同时获得多个对象,然后他们开始创建示例,这些示例将不符合单打模式。

  我们都知道,锁定后,我们可以通过锁定来解决它,例如,可以用来锁定整个方法。。每个呼叫方法都需要获取锁才能获得实例。如果表演在现场不好,呼叫频率很高,那就不是很好。

  仔细检查以解决锁的粒度问题,我们可以使用它来解决它。例如,以下代码,在第一个判断之后,您需要执行锁定操作,然后可以在第二个判决后创建实例。在这种方式上,与上述情况相比,粒径较低,因为那里无需锁定它。但是,实现此方法是否更麻烦,有什么方法可以解决它吗?

  使用Sync.Once可以用于实现单个情况的初始化逻辑,因为此逻辑最多只能运行一次。建议使用此方法来初始化单个情况。当然,您也可以使用饥饿的汉风格。

  以下是软件包的源代码。我删除了注释,代码不多,数据结构主要由和组成。其中,执行了存储功能,这是一个锁实例。

  通过一个,然后确保您只执行一次。使用原子读取DO方法中的DON变量。如果是0,则未执行代码F函数,然后调用Doslow方法传递F函数

  第一步是首先锁定。锁的目的是确保该方法可以同时执行,然后确定是否是。该判断等于我们上面的话,因为可能存在并发问题。然后执行该方法,然后保留使用。使用保证的方法只能执行一次。

  然后看,可以这样实现吗?

  这并不容易。使用原子的操作来解决并发问题。只能解决一次的问题可以解决,但是该方法可能是并发的。第一个呼叫将设置为呼叫方法。如果该方法是特殊消费,则第二个呼叫者在获得时将其直接获取。目前,该方法不是第二次执行,但此时第二个呼叫者可以继续执行后一个代码。如果方法背后的代码创建了示例,但是由于该方法仍在执行中,可能会出现错误问题。因此,使用官方方法。

  理解源代码后,我们可以扩展软件包。例如,该方法在执行时报告错误。例如,如果连接初始化失败,该怎么办?我们可以实现该软件包的高端版本。特定代码可以参考以下实现

  由于我们没有执行的结果,因此我们不知道何时执行。如果有并发,您需要知道您是否成功。您可以看到以下情况。我将在此处使用连接问题进行解释。该方法设置为在执行完成后设置值,然后其他人可以获得是否建立连接,然后进行后续操作。