5

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?

Razib
  • 10,965
  • 11
  • 53
  • 80
user3692521
  • 2,563
  • 5
  • 27
  • 33

3 Answers3

5

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.

Dermot Blair
  • 1,600
  • 10
  • 10
4

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.

Razib
  • 10,965
  • 11
  • 53
  • 80
1

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.*
wgitscht
  • 2,676
  • 2
  • 21
  • 25