Reputation: 2641
Are operations on arrays in Java thread safe?
If not how to make access to an array thread safe in Java for both reads and writes?
Upvotes: 5
Views: 3408
Reputation: 11163
Operation on array in java is not thread safe. Instead you may use ArrayList
with Collections.synchronizedList()
Suppose we are trying to populate a synchronized ArrayList of String. Then you can add item to the list like -
List<String> list =
Collections.synchronizedList(new ArrayList<String>());
//Adding elements to synchronized ArrayList
list.add("Item1");
list.add("Item2");
list.add("Item3");
Then access them from a synchronized
block like this -
synchronized(list) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
Or you may use a thread safe variant of ArrayList - CopyOnWriteArrayList. A good example can be found here.
Hope it will help.
Upvotes: 4
Reputation: 2776
array operations are not threadsafe. you can either lock on a field, i would recommend to add a field e.g. named LOCK and do the
void add(){
syncronized(LOCK) {
// add
}
}
void get(int i){
synchronized(LOCK){
// return
}
}
or simply use
java.util.concurrent.*
Upvotes: 1
Reputation: 1620
You will not get an invalid state when changing arrays using multiple threads. However if a certain thread has edited a value in the array, there is no guarantee that another thread will see the changes. Similar issues occur for non-volatile variables.
Upvotes: 5