Java线程中的数组操作安全吗?
如果不是,那么如何使Java中的数组线程在读写过程中都是安全的?
发布于 2015-03-19 11:37:09
在java中对数组进行操作并不是线程安全。相反,您可以将ArrayList
与Collections.synchronizedList()
结合使用。
假设我们正在尝试填充字符串的同步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的线程安全变体。一个很好的例子可以找到这里。
希望能帮上忙。
发布于 2015-03-19 11:37:27
使用多个线程更改数组时,不会获得无效状态。但是,如果某个线程已编辑了数组中的值,则无法保证另一个线程将看到更改。对于非易失性变量也会出现类似的问题。
发布于 2015-03-19 11:38:05
数组操作不是线程安全。您可以锁定一个字段,我建议添加一个字段,例如,命名锁,然后执行
void add(){
syncronized(LOCK) {
// add
}
}
void get(int i){
synchronized(LOCK){
// return
}
}
或者简单地使用
java.util.concurrent.*
https://stackoverflow.com/questions/29153404
复制