0

我想知道在访问一个具有多个线程但只能读取或仅写入的数组时是否会出现任何问题。

当线程写入数组时,它们写入的顺序无关紧要,即使它们写入同一个条目,所有线程也会写入相同的值。

例如,如果我想通过 Eratosthenes 筛找到素数:我创建一个连续数字数组,并使用多个线程将所有素数的倍数设置为 0。

删除 2 的倍数的线程和删除 5 的倍数的线程是否同时将数字 20 的条目设置为 0 或一个在另一个之前或之后都没有关系。

因此,这不是数据的质量或一致性的问题,而是在不面临任何 java 错误的情况下执行此操作的技术可能性。

4

2 回答 2

2

我假设您的意思是“没有同步控制”。最简洁的答案是不。

使用同步有两个原因:

  • 数据互斥
  • 线程之间的通信

您的设置表明第一个原因在您的情况下并不是真正的问题。该算法有效地将数据分离出来,以便多个工作线程不会使用相同的数据。

但是,为了使一个线程中完成的更改对另一个线程可见,您必须使用同步。如果没有同步,JVM 无法保证写入的顺序。一个线程所做的更新可能会在以后的任何时间在另一个线程中可见,甚至永远不可见。请参阅 Effective Java Item #66,或者查看 Java Concurrency in Practice 一书。

于 2013-02-04T22:57:52.303 回答
0

我认为它不会起作用,因为最终您需要读取变量(输出它们,保存到磁盘等)。并且必须同步读取以保证正确的线程间操作顺序。请记住,没有同步 java 只能保证线程内操作的顺序。

现在,您可以说您根本不想阅读它们,但如果是这种情况,java 可以优化丢弃整个代码。

于 2013-02-04T22:42:35.290 回答