我想知道在访问一个包含多个线程的数组时是否存在任何问题,但只能读取或只能写入。
当线程写入数组时,它们写入的顺序无关紧要,即使它们写入相同的条目,所有线程也会写入相同的值。
例如,如果我想通过Eratosthenes的Sieve找到素数: 我创建了一个连续数字数组,并使用多个线程将所有素数的倍数设置为0。
如果击出2的倍数的线程和击出5的倍数的线程同时将数字20的输入设置为0或者在另一个之前或之后设置,则无关紧要。 / p>
所以这不是数据质量或一致性的问题,而是技术可能性,不会遇到任何java错误。
答案 0 :(得分:2)
我假设你的意思是“没有同步控制”。简短的回答是否定的。
使用同步有两个原因:
您的设置表明第一个原因在您的情况下并不是真正的问题。该算法有效地将数据分离出来,以便多个工作线程不会使用相同的数据。
但是,为了使一个线程中的更改对另一个线程可见,您必须使用同步。如果没有同步,JVM不保证写入的顺序。一个线程所做的更新可能在以后的任何时间在另一个线程中可见,甚至从不。请参阅Effective Java Item#66,或者查看Java Concurrency in Practice一书。
答案 1 :(得分:0)
我认为它不会起作用,因为最终你需要读取变量(输出它们,保存到磁盘等)。并且必须同步读取以保证正确的线程间操作顺序。请记住,没有同步,java只保证内部线程操作顺序。
现在,你可以说你根本不想阅读它们,但如果是这样的话,java可以优化丢弃整个代码。