与来自多个线程的数组的非锁定交互(在Java中)
我需要从两个线程访问一个字符串数组。它必须非常快并且线程安全。我不喜欢使用锁,我可以采取什么方法使无锁线程安全的字符串数组?我需要一个Java配方。根据定义,争用线程共享的内存中唯一可用的线程安全写入操作是由CPU中的原子指令提供的操作。这与Java无关(至少在几乎所有情况下都是如此),但值得注意的是,在并发环境中无锁写是可能的 也就是说,如果你想写入数组,你可能需要有锁。锁是一般问题的解决方案 但是,您可以在多个线程之间愉快地共享一个数组,而不会出现问题,只要它们只从数组中读取。因此,如果您的数组是不可变的(或者是任何其他对象),那么它将是线程安全的,因为从来没有争用的机会 因此,假设您想从两个不同的线程写入数组,但您担心争用。也许每个线程都想记录大量数据。这个问题有几种不同的解决方案:我将试着解释一些。这并不是详尽无遗的,因为并发是一个很难解决的问题,尽管有一些常见的方法,但答案往往取决于具体情况与来自多个线程的数组的非锁定交互(在Java中),java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我需要从两个线程访问一个字符串数组。它必须非常快并且线程安全。我不喜欢使用锁,我可以采取什么方法使无锁线程安全的字符串数组?我需要一个Java配方。根据定义,争用线程共享的内存中唯一可用的线程安全写入操作是由CPU中的原子指令提供的操作。这与Java无关(至少在几乎所有情况下都是如此),但值得注意的是,在并发环境中无锁写是可能的 也就是说,如果你想写入数组,你可能需要有锁。锁是一般问题的解决方案 但是,您可以在多个线程之间愉快地共享一个数组,而不会出现问题,只要它们只从数组中读取。因此,如果您的
此选项可能适合您所寻找的内容(无锁、线程安全)。使用内置的如何?老实说,“无锁线程安全”是一个矛盾的说法。你有密码吗?你想要实现什么?什么是非常快的?如果有一些细节,这个问题肯定会更好。我试着解释了一些通用的并发方法。啊,还有一件事:让事情变得更快,通过使它更复杂,通常应该在测量之后完成。根据定义,“更多代码”意味着“占用更多资源”。因此,用一个线程编写代码,测量、验证这是否足够快,然后采取适当的步骤(你甚至不能100%确定,更多的线程将使事务更快)。我看过很多“这可能会成为瓶颈代码”(也是我自己写的:P),它们从来都不是瓶颈,只是更复杂、更难理解……谢谢你,很好的大纲。您可以补充一点,生产者/消费者可以很好地与LMAX Disruptor配合使用。这就是我最终要使用的设计。