【发布时间】:2015-05-23 02:06:08
【问题描述】:
Java线程中的数组操作安全吗?
如果不是,如何在 Java 中对数组线程进行安全的读写访问?
【问题讨论】:
标签: java multithreading arraylist thread-safety
Java线程中的数组操作安全吗?
如果不是,如何在 Java 中对数组线程进行安全的读写访问?
【问题讨论】:
标签: java multithreading arraylist thread-safety
java 中的数组操作不是线程安全的。相反,您可以使用 ArrayList 和 Collections.synchronizedList()
假设我们正在尝试填充 String 的同步 ArrayList。然后您可以将项目添加到列表中 -
List<String> list =
Collections.synchronizedList(new ArrayList<String>());
//Adding elements to synchronized ArrayList
list.add("Item1");
list.add("Item2");
list.add("Item3");
然后像这样从synchronized 块访问它们 -
synchronized(list) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
或者您可以使用 ArrayList 的线程安全变体 - CopyOnWriteArrayList。一个很好的例子可以找到here。
希望它会有所帮助。
【讨论】:
使用多个线程更改数组时不会出现无效状态。但是,如果某个线程编辑了数组中的值,则不能保证另一个线程会看到更改。非易失性变量也会出现类似问题。
【讨论】:
数组操作不是线程安全的。您可以锁定一个字段,我建议添加一个字段,例如命名为 LOCK 并执行
void add(){
syncronized(LOCK) {
// add
}
}
void get(int i){
synchronized(LOCK){
// return
}
}
或者干脆使用
java.util.concurrent.*
【讨论】: