user3692521
user3692521

Reputation: 2641

How to access an array thread safely in Java?

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

Answers (3)

Razib
Razib

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

wgitscht
wgitscht

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

Dermot Blair
Dermot Blair

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

Related Questions