如何在 Java 中安全地访问数组线程?
How to access an array thread safely in Java?
在 Java 线程中对数组的操作是否安全?
如果不是,如何确保在 Java 中访问数组线程对于读取和写入都是安全的?
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. A good example can be found here。
希望对您有所帮助。
使用多线程更改数组时不会出现无效状态。但是,如果某个线程编辑了数组中的值,则无法保证另一个线程会看到更改。非易失性变量也会出现类似问题。
数组操作不是线程安全的。您可以锁定一个字段,我建议添加一个字段,例如命名为 LOCK 并执行
void add(){
syncronized(LOCK) {
// add
}
}
void get(int i){
synchronized(LOCK){
// return
}
}
或简单地使用
java.util.concurrent.*
在 Java 线程中对数组的操作是否安全?
如果不是,如何确保在 Java 中访问数组线程对于读取和写入都是安全的?
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. A good example can be found here。
希望对您有所帮助。
使用多线程更改数组时不会出现无效状态。但是,如果某个线程编辑了数组中的值,则无法保证另一个线程会看到更改。非易失性变量也会出现类似问题。
数组操作不是线程安全的。您可以锁定一个字段,我建议添加一个字段,例如命名为 LOCK 并执行
void add(){
syncronized(LOCK) {
// add
}
}
void get(int i){
synchronized(LOCK){
// return
}
}
或简单地使用
java.util.concurrent.*