gpt4 book ai didi

java - 来自多个线程的数组的非锁定交互(在Java中)

转载 作者:行者123 更新时间:2023-12-03 12:59:31 28 4
gpt4 key购买 nike

我需要从两个线程访问一个字符串数组。它必须非常快速且线程安全。我不想使用锁,我可以采取什么方法来制作无锁的线程安全的字符串数组?我需要Java食谱。

最佳答案

根据定义,争用线程共享的内存中唯一可用的线程安全写操作是CPU中原子指令提供的操作。这实际上与Java无关(至少几乎所有时间),但是值得注意的是,在并发环境中进行无锁写入是可能的。

因此,这就是说,如果要写入数组,则可能需要具有锁。锁是解决一般问题的方法。

但是,只要它们仅从数组中读取,就可以在多个线程之间愉快地共享一个数组。因此,如果您的数组是不可变的(或与此相关的任何其他对象),则由于永远没有争用的机会,它将是线程安全的。

因此,假设您要从两个不同的线程写入数组,但是您担心争用。也许每个线程都想记录很多数据。这个问题有几种不同的解决方案:我将尝试解释一些问题。这并不是详尽无遗的,因为并发是一个很难解决的问题,尽管有一些通用的方法,但答案往往常常取决于特定的情况。

  • 最简单的方法

  • 写入数组并查看其性能时,只需在数组上使用锁即可。也许您现在实际上不需要担心性能问题。
  • 使用生产者/消费者方法

  • 与其让两个线程写入同一数组,不如让每个线程“产生”值(也许将它们放在不同的线程安全队列中),而让另一个线程负责“使用”这些值(将它们从队列中删除并放入它们中)在数组中)。

    如果顺序很重要,则此方法可能很难实现。但是您正在使用并发,因此排序无论如何都是不确定的。
  • 批量写入

  • 这里的想法是,您可以将要从每个线程放入数组的值存储在其自己的临时值批中。当批处理达到足够大的大小时,线程将锁定阵列并写入整个批处理。
  • 写入数组
  • 的单独部分

    如果您知道数据的大小,则可以通过简单地不允许线程写入相同的索引范围来避免争用。您将数组除以线程数。每个线程在创建时都会被赋予数组的起始索引。

    此选项可能符合您的要求(无锁,线程安全)。

    关于java - 来自多个线程的数组的非锁定交互(在Java中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43499198/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com