您确实需要原子性,因为写入数组是非原子性的过程。具体来说,Java绝对不会保证对数组成员的写操作对其他线程 不可见 ,除非您选择发布它们。
一种选择是每次创建一个新数组,对其进行完全初始化,然后在上发布
volatile,但是由于Java坚持必须首先将新分配的数组先清零,并且由于GC开销,这可能会产生大量成本。您可以使用“双缓冲”方案克服该问题,该方案只保留两个数组并在它们之间切换。这种方法有其危险性:线程可能仍在从您的写入线程已标记为非活动线程的数组中读取数据。这在很大程度上取决于代码的确切细节。
唯一的其他选择是以经典,无聊的代码
synchronized块进行整个阅读和写作。这具有延迟可预测的优点。就个人而言,我将从此开始,然后继续进行任何更复杂的事情(如果绝对受实际性能问题的困扰)。
您也可以使用读写锁进行锁定,但是只有在多个线程同时读取数组的情况下,这样做才有意义。这似乎不是您的情况。



