如果我有一个静态数组,在填充后不会改变。多个线程可以同时读取这个数组吗?我相信当一个线程尝试读取数组而另一个线程正在修改它时会出现问题。
感谢您的回复。
答案 0 :(得分:3)
在填充数组时,不要使用多个线程访问它。如果没有任何东西正在修改数据(只读取)那么你应该没问题。你的假设是正确的。
答案 1 :(得分:1)
这很安全。静态初始化的第一步是在类[1]
上进行同步如果读取了所有其他访问,则程序正确同步。
[1] http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.4.2
答案 2 :(得分:0)
是的,确切地说。谷歌“关键区域”了解更多细节。
答案 3 :(得分:0)
为避免多个线程同时访问相同的数据,您必须使用synchronized
。
答案 4 :(得分:0)
是的,只要一切都是只读的,那么你会没事的。只需确保没有线程在正在填充数组时尝试读取(例如,如果它被延迟填充)。
答案 5 :(得分:0)
是的,数据读取是线程安全的 - 只有在您更改必须关注的数据时才会发生。
答案 6 :(得分:0)
如果您主要阅读数组,ReadWriteLock
的效果会优于synchronized
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html
答案 7 :(得分:0)
由于上面的答案,我相信你现在已经有了答案。由于您正在使用多个线程,我将假设您在同一芯片上或分布式上使用多个内核。在这两种情况下,您都可以采取一些措施来提高性能:让所有线程都拥有数据副本,因为它是只读访问权限。通过这种方式,他们可以有效地使用缓存或本地内存,并避免通过内核间处理器间链接进行读取。如果数组太大(比最大缓存大),这显然是不切实际的。