Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与来自多个线程的数组的非锁定交互(在Java中)_Java_Multithreading_Concurrency_Thread Safety - Fatal编程技术网

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

与来自多个线程的数组的非锁定交互(在Java中),java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我需要从两个线程访问一个字符串数组。它必须非常快并且线程安全。我不喜欢使用锁,我可以采取什么方法使无锁线程安全的字符串数组?我需要一个Java配方。根据定义,争用线程共享的内存中唯一可用的线程安全写入操作是由CPU中的原子指令提供的操作。这与Java无关(至少在几乎所有情况下都是如此),但值得注意的是,在并发环境中无锁写是可能的 也就是说,如果你想写入数组,你可能需要有锁。锁是一般问题的解决方案 但是,您可以在多个线程之间愉快地共享一个数组,而不会出现问题,只要它们只从数组中读取。因此,如果您的

我需要从两个线程访问一个字符串数组。它必须非常快并且线程安全。我不喜欢使用锁,我可以采取什么方法使无锁线程安全的字符串数组?我需要一个Java配方。

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

也就是说,如果你想写入数组,你可能需要有锁。锁是一般问题的解决方案

但是,您可以在多个线程之间愉快地共享一个数组,而不会出现问题,只要它们只从数组中读取。因此,如果您的数组是不可变的(或者是任何其他对象),那么它将是线程安全的,因为从来没有争用的机会

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

  • 最简单的方法
  • 只需在写入数组时使用一个锁,然后查看它的性能。也许您现在实际上不需要担心性能问题

  • 使用生产者/消费者方法
  • 与其让两个线程写入同一个数组,不如让它们各自“生成”值(可能将它们放在不同的线程安全队列中),并让另一个线程负责“消费”这些值(将它们从队列中移除并放在数组中)

    如果顺序很重要,这种方法可能很难实现。但是您使用的是并发性,因此排序无论如何都是相当不确定的

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

  • 写入到阵列的各个部分
  • 如果您知道数据的大小,只需不允许线程写入相同的索引范围,就可以避免争用。将数组除以线程数。每个线程在创建时都会在数组中提供一个开始索引


    此选项可能适合您所寻找的内容(无锁、线程安全)。

    使用内置的如何?

    老实说,“无锁线程安全”是一个矛盾的说法。你有密码吗?你想要实现什么?什么是非常快的?如果有一些细节,这个问题肯定会更好。我试着解释了一些通用的并发方法。啊,还有一件事:让事情变得更快,通过使它更复杂,通常应该在测量之后完成。根据定义,“更多代码”意味着“占用更多资源”。因此,用一个线程编写代码,测量、验证这是否足够快,然后采取适当的步骤(你甚至不能100%确定,更多的线程将使事务更快)。我看过很多“这可能会成为瓶颈代码”(也是我自己写的:P),它们从来都不是瓶颈,只是更复杂、更难理解……谢谢你,很好的大纲。您可以补充一点,生产者/消费者可以很好地与LMAX Disruptor配合使用。这就是我最终要使用的设计。